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

Python 增强提案

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 *wstrPy_ssize_t wstr_length,以支持这些废弃的 API。

本 PEP 计划在 Python 3.12 之前移除 wstrwstr_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_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