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

Python 개선 제안 한국어 번역

PEP 623 – 유니코드에서 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를 지원하기 위해 유니코드 구조체에 wchar_t *wstr 및 Py_ssize_t wstr_length를 도입했습니다.

이 PEP는 wstr 및 wstr_length를, 이 멤버들을 사용하는 폐지 예정 API와 함께 Python 3.12까지 제거할 계획입니다.

이 멤버들을 사용하지 않는 폐지 예정 API는 독립적으로 제거할 수 있으므로 이 PEP의 범위에 포함되지 않습니다.

동기

메모리 사용량

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

런타임 오버헤드

레거시 유니코드 객체를 지원하기 위해 많은 유니코드 API가 PyUnicode_READY()를 호출해야 합니다.

레거시 유니코드 객체 지원을 중단하면 이 오버헤드도 없앨 수 있습니다.

단순성

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

근거

Python 4.0은 아직 일정이 잡히지 않았습니다

PEP 393은 유니코드의 효율적인 내부 표현을 도입했고, Python의 “narrow” 빌드와 “wide” 빌드 사이의 경계를 없앴습니다.

PEP 393은 2012년에 릴리스된 Python 3.3에서 구현되었습니다. 그 이후로 기존 API는 폐지 예정 상태가 되었고, 제거는 Python 4.0으로 예정되었습니다.

PEP 393이 수락되었을 때는 Python 3.9의 다음 버전이 Python 4.0이 될 것으로 예상되었습니다. 하지만 Python 3.9의 다음 버전은 4.0이 아니라 Python 3.10입니다. 이 때문에 이 PEP는 제거 계획의 일정을 다시 잡습니다.

Python 2의 지원 종료(EOL)

Python 2에는 PEP 393 유니코드 구현이 없었으므로, 레거시 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#, Z, Z# 형식을 사용할 때 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를 발생시킵니다.

논의

참고 문헌