PEP 623 – 从 Unicode 中移除 wstr
- 作者:
- Inada Naoki <songofacandy at gmail.com>
- BDFL 代理:
- Victor Stinner <vstinner at python.org>
- 讨论地址:
- Python-Dev 邮件列表
- 状态:
- 最终版
- 类型:
- 标准跟踪
- 创建日期:
- 2020-06-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 “窄”构建和“宽”构建之间的界限。
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 已到达生命周期终点
由于 Python 2 没有PEP 393 Unicode 实现,旧 API 可能有助于支持 Python 2 和 3 的 C 扩展模块。
但 Python 2 已于 2020 年到达生命周期终点。我们可以移除为了与 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
。 - 当使用
u
、u#
、Z
和Z#
格式时,PyArg_ParseTuple()
和PyArg_ParseTupleAndKeywords()
会发出DeprecationWarning
。
Python 3.12
- 以下成员将从 Unicode 结构中移除
wstr
wstr_length
state.compact
state.ready
- The
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
。 - 当使用
u
、u#
、Z
和Z#
格式时,PyArg_ParseTuple()
和PyArg_ParseTupleAndKeywords()
会抛出SystemError
,就像其他不支持的格式字符一样。
讨论
参考
版权
本文档已置于公有领域。
来源:https://github.com/python/peps/blob/main/peps/pep-0623.rst
最后修改时间:2023-09-09 17:39:29 GMT