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 *wstr 與 Py_ssize_t wstr_length,以支援這些已棄用的 API。
本 PEP 計畫在 Python 3.12 前移除 wstr、wstr_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_KINDPyUnicode_READY()PyUnicode_IS_READY()PyUnicode_IS_COMPACT()
- 當
size > 0時,PyUnicode_FromUnicode(NULL, size)與PyUnicode_FromStringAndSize(NULL, size)會發出DeprecationWarning。 - 當使用
u、u#、Z與Z#格式時,PyArg_ParseTuple()與PyArg_ParseTupleAndKeywords()會發出DeprecationWarning。
Python 3.12
- 下列成員將從 Unicode 結構中移除:
wstrwstr_lengthstate.compactstate.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_KINDPyUnicode_READY()PyUnicode_IS_READY()PyUnicode_IS_COMPACT()
- 當
size > 0時,PyUnicode_FromStringAndSize(NULL, size))會引發RuntimeError。 - 當使用
u、u#、Z與Z#格式時,PyArg_ParseTuple()與PyArg_ParseTupleAndKeywords()會像其他不支援的格式字元一樣,引發SystemError。
討論
參考文獻
版權
此文件已歸入公有領域 (public domain)。
來源: https://github.com/python/peps/blob/main/peps/pep-0623.rst
最後修改: 2025-02-01 08:55:40 GMT