Following system colour scheme - Python 增強提案 Selected dark colour scheme - Python 增強提案 Selected light colour scheme - Python 增強提案

Python 增強提案 (Python Enhancement Proposals)

PEP 623 – 從 Unicode 中移除 wstr

作者:
Inada Naoki <songofacandy at gmail.com>
BDFL-Delegate:
Victor Stinner <vstinner at python.org>
討論於:
Python-Dev 討論串
狀態:
最終 (Final)
類型:
標準軌跡 (Standards Track)
建立日期:
2020年6月25日
Python 版本:
3.10
決議:
Python-Dev 討論串

目錄

摘要

PEP 393 棄用了一些 Unicode API,並在 Unicode 結構中引入了 wchar_t *wstrPy_ssize_t wstr_length,以支援這些已棄用的 API。

本 PEP 計畫在 Python 3.12 前移除 wstrwstr_length 以及使用這些成員的已棄用 API。

不使用這些成員的已棄用 API 不在此範疇內,因為它們可以獨立移除。

動機

記憶體使用量

str 是 Python 中最常用的型別之一。即使是最簡單的 ASCII 字串也擁有一個 wstr 成員。在 64 位元系統上,每個字串會因此消耗 8 個位元組。

執行時期開銷

為了支援舊版 Unicode 物件,許多 Unicode API 必須呼叫 PyUnicode_READY()

我們可以透過捨棄對舊版 Unicode 物件的支援來消除這種開銷。

簡潔性

支援舊版 Unicode 物件會使 Unicode 的實作變得更加複雜。在我們捨棄舊版 Unicode 物件之前,很難嘗試其他 Unicode 實作,例如 PyPy 中的 UTF-8 基礎實作。

原理

Python 4.0 尚未排定

PEP 393 引入了高效的 Unicode 內部表示法,並消除了 Python「窄(narrow)」與「寬(wide)」組建之間的界線。

PEP 393 實作於 2012 年發布的 Python 3.3 中。舊版 API 自那時起被棄用,移除計畫原本排定在 Python 4.0。

PEP 393 被接受時,Python 4.0 原本預期會是 Python 3.9 的下一個版本。但 Python 3.9 的下一個版本是 Python 3.10,而非 4.0。這就是為什麼本 PEP 重新規劃移除時程的原因。

Python 2 已達終止支援 (EOL)

由於 Python 2 沒有 PEP 393 的 Unicode 實作,舊版 API 可能有助於 C 擴充模組同時支援 Python 2 與 3。

但 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()
  • size > 0 時,PyUnicode_FromUnicode(NULL, size)PyUnicode_FromStringAndSize(NULL, size) 會發出 DeprecationWarning
  • 當使用 uu#ZZ# 格式時,PyArg_ParseTuple()PyArg_ParseTupleAndKeywords() 會發出 DeprecationWarning

Python 3.12

  • 下列成員將從 Unicode 結構中移除:
    • 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()
  • size > 0 時,PyUnicode_FromStringAndSize(NULL, size)) 會引發 RuntimeError
  • 當使用 uu#ZZ# 格式時,PyArg_ParseTuple()PyArg_ParseTupleAndKeywords() 會像其他不支援的格式字元一樣,引發 SystemError

討論

參考文獻


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

最後修改: 2025-02-01 08:55:40 GMT