PEP 623 – 从 Unicode 中移除 wstr
- 作者:
- 稻田直树 <songofacandy at gmail.com>
- BDFL 委托:
- Victor Stinner <vstinner at python.org>
- 讨论至:
- Python-Dev 帖子
- 状态:
- 最终版
- 类型:
- 标准跟踪
- 创建日期:
- 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 不在本 PEP 的范围内,因为它们可以独立移除。
动机
内存使用
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 “窄”和“宽”构建之间的界限。
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,就像其他不支持的格式字符一样。
讨论
参考资料
版权
本文档已置于公共领域。
来源:https://github.com/python/peps/blob/main/peps/pep-0623.rst