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

Python Enhancement Proposals

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

Inhaltsverzeichnis

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_KIND
    • PyUnicode_READY()
    • PyUnicode_IS_READY()
    • PyUnicode_IS_COMPACT()
  • PyUnicode_FromUnicode(NULL, size) und PyUnicode_FromStringAndSize(NULL, size) lösen eine DeprecationWarning aus, wenn size > 0 ist.
  • PyArg_ParseTuple() und PyArg_ParseTupleAndKeywords() lösen eine DeprecationWarning aus, wenn die Formate u, u#, Z und Z# verwendet werden.

Python 3.12

  • Die folgenden Member werden aus den Unicode-Strukturen entfernt
    • wstr
    • wstr_length
    • state.compact
    • state.ready
  • Die Struktur PyUnicodeObject wird 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_KIND
    • PyUnicode_READY()
    • PyUnicode_IS_READY()
    • PyUnicode_IS_COMPACT()
  • PyUnicode_FromStringAndSize(NULL, size)) löst eine RuntimeError aus, wenn size > 0 ist.
  • PyArg_ParseTuple() und PyArg_ParseTupleAndKeywords() lösen eine SystemError aus, wenn die Formate u, u#, Z und Z# sowie andere nicht unterstützte Formatzeichen verwendet werden.

Diskussion

Referenzen


Quelle: https://github.com/python/peps/blob/main/peps/pep-0623.rst

Zuletzt geändert: 2025-02-01 08:55:40 GMT