Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 개선 제안 한국어 번역

PEP 623 – Unicode에서 wstr 제거

Author:
Inada Naoki <songofacandy at gmail.com>
BDFL-Delegate:
Victor Stinner <vstinner at python.org>
Discussions-To:
Python-Dev thread
Status:
Final
Type:
Standards Track
Created:
25-Jun-2020
Python-Version:
3.10
Resolution:
Python-Dev thread

Table of Contents

번역·라이선스 안내

이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판

초록

PEP 393에서는 일부 유니코드 API를 더 이상 사용하지 않도록 지정하고, 이러한 API를 지원하기 위해 Unicode 구조체에 wchar_t *wstrPy_ssize_t wstr_length를 도입했습니다.

이 PEP에서는 이러한 멤버를 사용하는 더 이상 사용하지 않는 API와 함께 wstrwstr_length를 Python 3.12까지 제거할 계획입니다.

이러한 멤버를 사용하지 않는 더 이상 사용하지 않는 API는 독립적으로 제거할 수 있으므로 범위에 포함되지 않습니다.

동기

메모리 사용량

str은 Python에서 가장 많이 사용되는 타입 중 하나입니다. 가장 단순한 ASCII 문자열에도 wstr 멤버가 있습니다. 64비트 시스템에서는 문자열당 8바이트를 사용합니다.

런타임 오버헤드

레거시 Unicode 객체를 지원하려면 많은 Unicode API에서 PyUnicode_READY()를 호출해야 합니다.

레거시 Unicode 객체 지원을 중단하면 이 오버헤드도 제거할 수 있습니다.

단순성

레거시 Unicode 객체를 지원하면 Unicode 구현이 더 복잡해집니다. 레거시 Unicode 객체를 제거하기 전까지는 PyPy의 UTF-8 기반 구현과 같은 다른 Unicode 구현을 시도하기가 매우 어렵습니다.

근거

Python 4.0은 아직 일정이 정해지지 않았습니다.

PEP 393에서는 효율적인 Unicode 내부 표현을 도입하고 Python의 “좁은” 빌드와 “넓은” 빌드 사이의 경계를 제거했습니다.

PEP 393은 2012년에 릴리스된 Python 3.3에서 구현되었습니다. 이전 API는 그때부터 더 이상 사용하지 않도록 지정되었으며, 제거는 Python 4.0에서 진행될 예정이었습니다.

Python 4.0은 PEP 393이 승인되었을 때 Python 3.9의 다음 버전이 될 것으로 예상되었습니다. 그러나 Python 3.9의 다음 버전은 4.0이 아니라 Python 3.10입니다. 이것이 이 PEP에서 제거 계획을 다시 수립하는 이유입니다.

Python 2의 EOL 도달

Python 2에는 PEP 393의 Unicode 구현이 없었으므로, 레거시 API가 Python 2와 3을 모두 지원하는 C 확장 모듈에 도움이 될 수 있었습니다.

그러나 Python 2는 2020년에 EOL에 도달했습니다. Python 2와의 호환성을 위해 유지해 온 레거시 API를 제거할 수 있습니다.

계획

Python 3.9

다음 매크로와 함수는 Py_DEPRECATED 매크로를 사용하여 더 이상 사용하지 않는 것으로 표시합니다.

  • Py_UNICODE_WSTR_LENGTH()
  • PyUnicode_GET_SIZE()
  • PyUnicode_GetSize()
  • PyUnicode_GET_DATA_SIZE()
  • PyUnicode_AS_UNICODE()
  • PyUnicode_AS_DATA()
  • PyUnicode_AsUnicode()
  • _PyUnicode_AsUnicode()
  • PyUnicode_AsUnicodeAndSize()
  • PyUnicode_FromUnicode()

Python 3.10

  • 다음 매크로와 열거형 멤버는 사용 중단된 것으로 표시합니다. 가능한 경우 Py_DEPRECATED(3.10) 매크로를 사용합니다. 하지만 매크로를 쉽게 사용할 수 없는 경우에는 주석과 문서에서만 사용 중단된 것으로 표시합니다.
    • PyUnicode_WCHAR_KIND
    • PyUnicode_READY()
    • PyUnicode_IS_READY()
    • PyUnicode_IS_COMPACT()
  • PyUnicode_FromUnicode(NULL, size)PyUnicode_FromStringAndSize(NULL, size)size > 0인 경우 DeprecationWarning을 발생시킵니다.
  • PyArg_ParseTuple()PyArg_ParseTupleAndKeywords()u, u#, ZZ# 형식을 사용하는 경우 DeprecationWarning을 발생시킵니다.

Python 3.12

  • 다음 멤버는 유니코드 구조체에서 제거됩니다.
    • wstr
    • wstr_length
    • state.compact
    • state.ready
  • PyUnicodeObject 구조체가 제거됩니다.
  • 다음 매크로와 함수 및 열거형 멤버가 제거됩니다.
    • Py_UNICODE_WSTR_LENGTH()
    • PyUnicode_GET_SIZE()
    • PyUnicode_GetSize()
    • PyUnicode_GET_DATA_SIZE()
    • PyUnicode_AS_UNICODE()
    • PyUnicode_AS_DATA()
    • PyUnicode_AsUnicode()
    • _PyUnicode_AsUnicode()
    • PyUnicode_AsUnicodeAndSize()
    • PyUnicode_FromUnicode()
    • PyUnicode_WCHAR_KIND
    • PyUnicode_READY()
    • PyUnicode_IS_READY()
    • PyUnicode_IS_COMPACT()
  • PyUnicode_FromStringAndSize(NULL, size))size > 0일 때 RuntimeError를 발생시킵니다.
  • PyArg_ParseTuple()PyArg_ParseTupleAndKeywords()u, u#, Z, Z# 형식을 사용할 때 다른 지원되지 않는 형식 문자와 마찬가지로 SystemError를 발생시킵니다.

논의

참고 자료