PEP 623 – Entferne wstr aus Unicode
- Autor:
- Inada Naoki <songofacandy at gmail.com>
- BDFL-Delegate:
- Victor Stinner <vstinner at python.org>
- Discussions-To:
- Python-Dev thread
- Status:
- Final
- Typ:
- Standards Track
- Erstellt:
- 25-Jun-2020
- Python-Version:
- 3.10
- Resolution:
- Python-Dev thread
Zusammenfassung
PEP 393 hat einige Unicode-APIs als veraltet markiert und wchar_t *wstr und Py_ssize_t wstr_length in der Unicode-Struktur eingeführt, um diese veralteten APIs zu unterstützen.
Diese PEP plant die Entfernung von wstr und wstr_length mit den veralteten APIs, die diese Member verwenden, bis Python 3.12.
Veraltete APIs, die die Member nicht verwenden, sind nicht betroffen, da sie unabhängig entfernt werden können.
Motivation
Speicherverbrauch
str ist einer der am häufigsten verwendeten Typen in Python. Selbst die meisten einfachen ASCII-Strings haben ein wstr-Mitglied. Dies verbraucht 8 Bytes pro String auf 64-Bit-Systemen.
Laufzeit-Overhead
Um legacy Unicode-Objekte zu unterstützen, müssen viele Unicode-APIs PyUnicode_READY() aufrufen.
Wir können diesen Overhead ebenfalls entfernen, indem wir die Unterstützung für legacy Unicode-Objekte aufgeben.
Einfachheit
Die Unterstützung von legacy Unicode-Objekten macht die Unicode-Implementierung komplexer. Solange wir legacy Unicode-Objekte nicht aufgeben, ist es sehr schwierig, andere Unicode-Implementierungen wie eine UTF-8-basierte Implementierung in PyPy auszuprobieren.
Begründung
Python 4.0 ist noch nicht geplant
PEP 393 hat eine effiziente interne Darstellung von Unicode eingeführt und die Grenze zwischen „narrow“ und „wide“ Builds von Python entfernt.
PEP 393 wurde in Python 3.3 implementiert, das 2012 veröffentlicht wurde. Alte APIs wurden seitdem als veraltet markiert, und die Entfernung war für Python 4.0 geplant.
Python 4.0 wurde als Nachfolger von Python 3.9 erwartet, als PEP 393 angenommen wurde. Aber die nächste Version nach Python 3.9 ist Python 3.10, nicht 4.0. Deshalb plant diese PEP den Entfernungsplan erneut.
Python 2 erreichte EOL
Da Python 2 keine PEP 393 Unicode-Implementierung hatte, könnten legacy APIs C-Erweiterungsmodulen helfen, die sowohl Python 2 als auch 3 unterstützen.
Aber Python 2 erreichte sein EOL im Jahr 2020. Wir können legacy APIs entfernen, die zur Kompatibilität mit Python 2 beibehalten wurden.
Plan
Python 3.9
Diese Makros und Funktionen sind als veraltet markiert und verwenden das Py_DEPRECATED-Makro.
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
- Die folgenden Makros und Enum-Mitglieder sind als veraltet markiert. Das Makro
Py_DEPRECATED(3.10)wird, wo möglich, verwendet. Sie sind jedoch nur in Kommentaren und Dokumentation als veraltet gekennzeichnet, wenn das Makro nicht einfach verwendet werden kann.PyUnicode_WCHAR_KINDPyUnicode_READY()PyUnicode_IS_READY()PyUnicode_IS_COMPACT()
PyUnicode_FromUnicode(NULL, size)undPyUnicode_FromStringAndSize(NULL, size)lösen eineDeprecationWarningaus, wennsize > 0ist.PyArg_ParseTuple()undPyArg_ParseTupleAndKeywords()lösen eineDeprecationWarningaus, wenn die Formateu,u#,ZundZ#verwendet werden.
Python 3.12
- Die folgenden Member werden aus den Unicode-Strukturen entfernt
wstrwstr_lengthstate.compactstate.ready
- Die Struktur
PyUnicodeObjectwird entfernt. - Die folgenden Makros und Funktionen sowie Enum-Mitglieder werden entfernt
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_KINDPyUnicode_READY()PyUnicode_IS_READY()PyUnicode_IS_COMPACT()
PyUnicode_FromStringAndSize(NULL, size))löst eineRuntimeErroraus, wennsize > 0ist.PyArg_ParseTuple()undPyArg_ParseTupleAndKeywords()lösen eineSystemErroraus, wenn die Formateu,u#,ZundZ#sowie andere nicht unterstützte Formatzeichen verwendet werden.
Diskussion
Referenzen
- bpo-38604: Zeitplan für die Entfernung der Py_UNICODE API
- bpo-36346: Vorbereitung zur Entfernung der legacy Unicode C API
- bpo-30863: Rewrite PyUnicode_AsWideChar() und PyUnicode_AsWideCharString(): Sie cachen nicht mehr die
wchar_t*-Repräsentation von String-Objekten.
Urheberrecht
Dieses Dokument wurde gemeinfrei erklärt.
Quelle: https://github.com/python/peps/blob/main/peps/pep-0623.rst
Zuletzt geändert: 2025-02-01 08:55:40 GMT