Python 3.13 有哪些新功能¶
- 编辑:
Adam Turner 和 Thomas Wouters
本文解释了 Python 3.13 相对于 3.12 的新功能。Python 3.13 于 2024 年 10 月 7 日发布。有关完整详细信息,请参阅更新日志。
参见
PEP 719 – Python 3.13 发布计划
总结 – 发布亮点¶
Python 3.13 是 Python 编程语言的一个稳定版本,其中混合了对语言、实现和标准库的更改。最大的变化包括新的交互式解释器、在自由线程模式下运行的实验性支持(PEP 703)以及即时编译器(PEP 744)。
错误消息继续改进,默认情况下回溯现在以颜色突出显示。locals()
内置函数现在具有用于更改返回映射的定义语义,并且类型参数现在支持默认值。
库的更改包括删除已弃用的 API 和模块,以及对用户友好性和正确性的常规改进。继 Python 3.11 中弃用后(PEP 594),几个遗留的标准库模块现已被移除。
本文不试图提供所有新功能的完整规范,而是提供一个方便的概述。有关完整详细信息,请参阅文档,例如库参考和语言参考。要了解更改的完整实现和设计原理,请参阅特定新功能的 PEP;但请注意,一旦功能完全实现,PEP 通常不会保持最新。有关从早期 Python 版本升级的指南,请参阅移植到 Python 3.13。
解释器的改进
PEP 667:在修改返回映射时,内置函数
locals()
现在具有已定义语义。Python 调试器和类似工具现在即使在并发代码执行期间也能更可靠地更新优化范围中的局部变量。PEP 703:CPython 3.13 实验性支持在禁用全局解释器锁的情况下运行。有关更多详细信息,请参阅自由线程 CPython。
PEP 744:添加了一个基本的JIT 编译器。它目前默认禁用(尽管我们可能会在以后启用它)。性能提升适中——我们预计在接下来的几个版本中会改进这一点。
新交互式解释器中的颜色支持,以及回溯和doctest输出中的颜色支持。这可以通过
PYTHON_COLORS
和NO_COLOR
环境变量禁用。
Python 数据模型改进
__static_attributes__
存储类体中任何函数中通过self.X
访问的属性名称。__firstlineno__
记录类定义的第一个行号。
标准库的重大改进
添加一个新的
PythonFinalizationError
异常,当操作在解释器关闭期间被阻塞时引发。argparse
模块现在支持弃用命令行选项、位置参数和子命令。新函数
base64.z85encode()
和base64.z85decode()
支持编码和解码 Z85 数据。copy
模块现在有一个copy.replace()
函数,支持许多内置类型和任何定义__replace__()
方法的类。新的
dbm.sqlite3
模块现在是默认的dbm
后端。
安全改进
C API 的改进
Py_mod_gil
插槽现在用于指示扩展模块支持在禁用GIL 的情况下运行。PyTime C API 已添加,提供对系统时钟的访问。
PyMutex
是一个新的轻量级互斥锁,占用一个字节。
新的类型特性
PEP 696:类型参数(
typing.TypeVar
、typing.ParamSpec
和typing.TypeVarTuple
)现在支持默认值。PEP 702:新的
warnings.deprecated()
装饰器添加了对在类型系统和运行时标记弃用的支持。PEP 705:
typing.ReadOnly
可用于将typing.TypedDict
的项标记为类型检查器的只读项。PEP 742:
typing.TypeIs
作为typing.TypeGuard
的替代方案,提供更直观的类型缩小行为。
平台支持
wasm32-wasi
现在被支持为Tier 2 平台。wasm32-emscripten
不再是官方支持的平台。
重要移除
PEP 594:剩余的 19 个“废弃的模块”(遗留标准库模块)已从标准库中移除:
aifc
、audioop
、cgi
、cgitb
、chunk
、crypt
、imghdr
、mailcap
、msilib
、nis
、nntplib
、ossaudiodev
、pipes
、sndhdr
、spwd
、sunau
、telnetlib
、uu
和xdrlib
。移除 2to3 工具和
lib2to3
模块(在 Python 3.11 中已弃用)。移除
tkinter.tix
模块(在 Python 3.6 中已弃用)。移除
locale.resetlocale()
函数。移除
typing.io
和typing.re
命名空间。移除链式
classmethod
描述符。
发布计划变更
PEP 602(“Python 年度发布周期”)已更新,将新版本的完全支持(“bugfix”)期限延长至两年。此更新的策略意味着:
Python 3.9–3.12 有一年半的完全支持,随后是三年半的安全修复。
Python 3.13 及更高版本有两年的完全支持,随后是三年的安全修复。
新功能¶
一个更好的交互式解释器¶
Python 现在默认使用基于 PyPy 项目代码的新交互式 shell。当用户从交互式终端启动 REPL 时,现在支持以下新功能:
多行编辑并保留历史记录。
直接支持 REPL 特定命令,如 help、exit 和 quit,无需将其作为函数调用。
提示符和回溯默认启用颜色。
使用 F1 进行交互式帮助浏览,并带有单独的命令历史记录。
使用 F3 的“粘贴模式”使粘贴更大的代码块更容易(再次按 F3 返回到常规提示符)。
要禁用新的交互式 shell,请设置 PYTHON_BASIC_REPL
环境变量。有关交互模式的更多信息,请参阅交互模式。
(由 Pablo Galindo Salgado、Łukasz Langa 和 Lysandros Nikolaou 在 gh-111201 中贡献,基于 PyPy 项目的代码。Windows 支持由 Dino Viehland 和 Anthony Shaw 贡献。)
改进的错误消息¶
解释器现在默认在终端显示回溯时使用颜色。此功能可以通过新的
PYTHON_COLORS
环境变量以及规范的NO_COLOR
和FORCE_COLOR
环境变量进行控制。(由 Pablo Galindo Salgado 在 gh-112730 中贡献。)一个常见的错误是编写与标准库模块同名的脚本。当这导致错误时,我们现在显示更友好的错误消息:
$ python random.py Traceback (most recent call last): File "/home/me/random.py", line 1, in <module> import random File "/home/me/random.py", line 3, in <module> print(random.randint(5)) ^^^^^^^^^^^^^^ AttributeError: module 'random' has no attribute 'randint' (consider renaming '/home/me/random.py' since it has the same name as the standard library module named 'random' and prevents importing that standard library module)
类似地,如果脚本与它尝试导入的第三方模块同名,并且这导致错误,我们也会显示更友好的错误消息:
$ python numpy.py Traceback (most recent call last): File "/home/me/numpy.py", line 1, in <module> import numpy as np File "/home/me/numpy.py", line 3, in <module> np.array([1, 2, 3]) ^^^^^^^^ AttributeError: module 'numpy' has no attribute 'array' (consider renaming '/home/me/numpy.py' if it has the same name as a library you intended to import)
(由 Shantanu Jain 在 gh-95754 中贡献。)
当向函数传递不正确的关键字参数时,错误消息现在尝试建议正确的关键字参数。
>>> "Better error messages!".split(max_split=1) Traceback (most recent call last): File "<python-input-0>", line 1, in <module> "Better error messages!".split(max_split=1) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^ TypeError: split() got an unexpected keyword argument 'max_split'. Did you mean 'maxsplit'?
(由 Pablo Galindo Salgado 和 Shantanu Jain 在 gh-107944 中贡献。)
自由线程的 CPython¶
CPython 现在实验性支持在禁用全局解释器锁 (GIL) 的自由线程模式下运行。这是一个实验性功能,因此默认情况下未启用。自由线程模式需要一个不同的可执行文件,通常称为 python3.13t
或 python3.13t.exe
。标记为 free-threaded 的预构建二进制文件可以作为官方 Windows 和 macOS 安装程序的一部分安装,或者可以使用 --disable-gil
选项从源代码构建 CPython。
自由线程执行允许通过在可用 CPU 核心上并行运行线程来充分利用可用的处理能力。虽然并非所有软件都会自动从中受益,但考虑到线程设计的程序在多核硬件上会运行得更快。自由线程模式是实验性的,改进工作正在进行中:预计会有一些错误和显着的单线程性能损失。CPython 的自由线程构建支持在运行时使用环境变量 PYTHON_GIL
或命令行选项 -X gil=1
可选地启用 GIL。
要检查当前解释器是否支持自由线程,python -VV
和 sys.version
包含“experimental free-threading build”。新的 sys._is_gil_enabled()
函数可用于检查运行进程中 GIL 是否实际禁用。
C-API 扩展模块需要专门为自由线程构建而构建。支持在禁用 GIL 的情况下运行的扩展应使用 Py_mod_gil
插槽。使用单阶段初始化的扩展应使用 PyUnstable_Module_SetGIL()
来指示它们是否支持在禁用 GIL 的情况下运行。导入不使用这些机制的 C 扩展将导致 GIL 被启用,除非使用 PYTHON_GIL
环境变量或 -X gil=0
选项明确禁用 GIL。在自由线程构建中安装包含 C 扩展的包需要 pip 24.1 或更高版本。
这项工作得益于许多个人和组织,包括 Python 贡献者社区以及第三方项目,他们测试并启用了自由线程支持。值得注意的贡献者包括:Sam Gross、Ken Jin、Donghee Na、Itamar Oren、Matt Page、Brett Simmers、Dino Viehland、Carl Meyer、Nathan Goldbaum、Ralf Gommers、Lysandros Nikolaou 等等。许多这些贡献者受雇于 Meta,Meta 为支持此项目提供了大量的工程资源。
一个实验性的即时 (JIT) 编译器¶
当使用 --enable-experimental-jit
选项配置和构建 CPython 时,会添加一个即时 (JIT) 编译器,它可以加速一些 Python 程序。在 Windows 上,使用 PCbuild/build.bat --experimental-jit
启用 JIT 或 --experimental-jit-interpreter
启用 Tier 2 解释器。构建要求和更多支持信息包含在 Tools/jit/README.md
中。
--enable-experimental-jit
选项接受这些(可选)值,如果存在 --enable-experimental-jit
而没有可选值,则默认为 yes
。
no
:禁用整个 Tier 2 和 JIT 管道。yes
:启用 JIT。要在运行时禁用 JIT,请传递环境变量PYTHON_JIT=0
。yes-off
:构建 JIT 但默认禁用。要在运行时启用 JIT,请传递环境变量PYTHON_JIT=1
。interpreter
:启用 Tier 2 解释器但禁用 JIT。解释器可以通过运行PYTHON_JIT=0
来禁用。
内部架构大致如下:
我们从专门的 Tier 1 字节码 开始。有关详细信息,请参阅3.11 新功能。
当 Tier 1 字节码足够“热”时,它会被翻译成一个新的纯内部中间表示 (IR),称为 Tier 2 IR,有时也称为微操作码 (“uops”)。
Tier 2 IR 使用与 Tier 1 相同的基于堆栈的虚拟机,但指令格式更适合翻译成机器码。
我们对 Tier 2 IR 有多个优化阶段,这些阶段在解释或翻译成机器码之前应用。
有一个 Tier 2 解释器,但它主要用于调试优化管道的早期阶段。Tier 2 解释器可以通过使用
--enable-experimental-jit=interpreter
配置 Python 来启用。启用 JIT 后,优化后的 Tier 2 IR 将被翻译成机器码,然后执行。
机器码翻译过程使用一种称为 复制-修补 的技术。它没有运行时依赖,但新增了对 LLVM 的构建时依赖。
参见
(JIT 由 Brandt Bucher 贡献,灵感来自 Haoran Xu 和 Fredrik Kjolstad 的论文。Tier 2 IR 由 Mark Shannon 和 Guido van Rossum 贡献。Tier 2 优化器由 Ken Jin 贡献。)
为 locals()
定义了变异语义¶
从历史上看,修改 locals()
返回值的预期结果已留给各个 Python 实现来定义。从 Python 3.13 开始,PEP 667 将 CPython 在大多数代码执行范围内的历史行为标准化,但将优化范围(函数、生成器、协程、推导式和生成器表达式)更改为明确返回当前分配的局部变量的独立快照,包括在闭包中捕获的局部引用的非局部变量。
这一对优化范围中 locals()
语义的更改也影响了隐式以 locals()
为目标的代码执行函数的默认行为,如果未提供显式命名空间(例如 exec()
和 eval()
)。在以前的版本中,调用代码执行函数后是否可以通过调用 locals()
访问更改取决于实现。特别是在 CPython 中,此类代码通常会按预期工作,但有时可能会由于其他代码(包括调试器和代码执行跟踪工具)可能重置该范围内的共享快照而在优化范围中失败。现在,代码将始终针对优化范围中局部变量的独立快照运行,因此在后续调用 locals()
时,这些更改将永远不可见。要访问在这些情况下所做的更改,现在必须将显式命名空间引用传递给相关函数。或者,更新受影响的代码以使用返回结果代码执行命名空间的高级代码执行 API 可能有意义(例如,从磁盘执行 Python 文件时使用 runpy.run_path()
)。
为了确保调试器和类似工具能够可靠地更新受此更改影响的范围中的局部变量,FrameType.f_locals
现在返回一个可写入的代理,指向这些范围中的帧的局部变量和局部引用的非局部变量,而不是返回一个不一致更新的共享 dict
实例,该实例具有未定义的运行时语义。
有关更多详细信息,包括相关的 C API 更改和弃用,请参阅PEP 667。下面还提供了受影响的 Python API 和 C API 的移植说明。
(PEP 和实现由 Mark Shannon 和 Tian Gao 在 gh-74929 中贡献。文档更新由 Guido van Rossum 和 Alyssa Coghlan 提供。)
支持移动平台¶
PEP 730:iOS 现在是PEP 11 支持的平台,arm64-apple-ios
和 arm64-apple-ios-simulator
目标位于 Tier 3(分别指 2013 年后发布的 iPhone 和 iPad 设备以及在 Apple 芯片硬件上运行的 Xcode iOS 模拟器)。x86_64-apple-ios-simulator
(在旧 x86_64
硬件上运行的 Xcode iOS 模拟器)不是 Tier 3 支持的平台,但将获得尽力支持。(PEP 由 Russell Keith-Magee 编写并贡献实现,见 gh-114099。)
PEP 738:Android 现在是PEP 11 支持的平台,aarch64-linux-android
和 x86_64-linux-android
目标位于 Tier 3。32 位目标 arm-linux-androideabi
和 i686-linux-android
不是 Tier 3 支持的平台,但将获得尽力支持。(PEP 由 Malcolm Smith 编写并贡献实现,见 gh-116622。)
其他语言更改¶
编译器现在从 docstring 的每一行中剥离常见的开头空白。这减少了字节码缓存的大小(例如
.pyc
文件),例如在 SQLAlchemy 2.0 中的sqlalchemy.orm.session
中,文件大小减少了大约 5%。此更改会影响使用 docstring 的工具,例如doctest
。>>> def spam(): ... """ ... This is a docstring with ... leading whitespace. ... ... It even has multiple paragraphs! ... """ ... >>> spam.__doc__ '\nThis is a docstring with\n leading whitespace.\n\nIt even has multiple paragraphs!\n'
(由 Inada Naoki 在 gh-81283 中贡献。)
类范围内的注释范围现在可以包含 lambda 和推导式。位于类范围内的推导式不会内联到其父范围。
class C[T]: type Alias = lambda: T
Future 语句不再由
__future__
模块的相对导入触发,这意味着形式为from .__future__ import ...
的语句现在只是标准的相对导入,没有激活特殊功能。(由 Jeremiah Gabriel Pascual 在 gh-118216 中贡献。)global
声明现在允许在except
块中使用,当该全局变量在else
块中使用时。以前这会引发错误的SyntaxError
。(由 Irit Katriel 在 gh-111123 中贡献。)添加
PYTHON_FROZEN_MODULES
,这是一个新的环境变量,用于确定导入机制是否忽略冻结模块,等同于-X frozen_modules
命令行选项。(由 Yilei Yang 在 gh-111374 中贡献。)添加对 perf 分析器的支持,使其在没有帧指针的情况下工作,通过新的环境变量
PYTHON_PERF_JIT_SUPPORT
和命令行选项-X perf_jit
。(由 Pablo Galindo 在 gh-118518 中贡献。).python_history
文件的位置可以通过新的PYTHON_HISTORY
环境变量更改。(由 Levi Sabah、Zackery Spytz 和 Hugo van Kemenade 在 gh-73965 中贡献。)类有一个新的
__static_attributes__
属性。这由编译器填充一个元组,其中包含类的属性名称,这些属性名称通过其正文中的任何函数中的self.<name>
赋值。(由 Irit Katriel 在 gh-115775 中贡献。)编译器现在在类上创建
__firstlineno__
属性,其值为类定义的第一个行号。(由 Serhiy Storchaka 在 gh-118465 中贡献。)exec()
和eval()
内置函数现在接受 globals 和 locals 参数作为关键字参数。(由 Raphael Gaschignard 在 gh-105879 中贡献)内置函数
compile()
现在接受一个新标志ast.PyCF_OPTIMIZED_AST
,它类似于ast.PyCF_ONLY_AST
,不同之处在于返回的 AST 根据 optimize 参数的值进行优化。(由 Irit Katriel 在 gh-108113 中贡献)。在
property
对象上添加__name__
属性。(由 Eugene Toder 在 gh-101860 中贡献。)添加
PythonFinalizationError
,这是一个新的异常,派生自RuntimeError
,用于在解释器终止期间操作被阻塞时发出信号。以下可调用对象现在会引发PythonFinalizationError
,而不是RuntimeError
:(由 Victor Stinner 在 gh-114570 中贡献。)
允许
str.replace()
的 count 参数为关键字参数。(由 Hugo van Kemenade 在 gh-106487 中贡献。)现在,如果布尔值作为文件描述符参数传递,许多函数都会发出警告。这有助于更早地发现一些错误。(由 Serhiy Storchaka 在 gh-82626 中贡献。)
在
bz2
、lzma
、tarfile
和zipfile
模块中,为压缩和存档的类文件对象添加了name
和mode
属性。(由 Serhiy Storchaka 在 gh-115961 中贡献。)
新模块¶
dbm.sqlite3
:dbm 的 SQLite 后端。(由 Raymond Hettinger 和 Erlend E. Aasland 在 gh-100414 中贡献。)
改进的模块¶
argparse¶
在
add_argument()
和add_parser()
方法中添加了 deprecated 参数,以启用弃用命令行选项、位置参数和子命令。(由 Serhiy Storchaka 在 gh-83648 中贡献。)
array¶
添加了 Unicode 字符的
'w'
类型代码(Py_UCS4
)。它应该用于代替已弃用的'u'
类型代码。(由 Inada Naoki 在 gh-80480 中贡献。)通过实现
clear()
方法,将array.array
注册为MutableSequence
。(由 Mike Zimin 在 gh-114894 中贡献。)
ast¶
ast
模块中节点类型的构造函数现在对其接受的参数更加严格,并且在省略参数时具有更直观的行为。如果 AST 节点上的可选字段在构造实例时未作为参数包含,则该字段现在将设置为
None
。类似地,如果省略列表字段,则该字段现在将设置为空列表;如果省略expr_context
字段,则其默认值为Load()
。(以前,在所有情况下,新构造的 AST 节点实例上都会缺少该属性。)在所有其他情况下,如果省略了必需参数,则节点构造函数将发出
DeprecationWarning
。这将在 Python 3.15 中引发异常。类似地,向构造函数传递不映射到 AST 节点上字段的关键字参数现在已弃用,并将在 Python 3.15 中引发异常。这些更改不适用于
ast.AST
的用户定义子类,除非该类通过定义AST._field_types
映射来选择新行为。ast.parse()
现在接受一个可选参数 optimize,该参数会传递给compile()
。这使得获取优化后的 AST 成为可能。(由 Irit Katriel 在 gh-108113 中贡献。)
asyncio¶
asyncio.as_completed()
现在返回一个既是异步迭代器又是普通可迭代对象,其中包含可等待对象。异步迭代产生的可等待对象包括传入的原始任务或 Future 对象,从而更容易将结果与正在完成的任务关联起来。(由 Justin Arthur 在 gh-77714 中贡献。)asyncio.loop.create_unix_server()
现在会在服务器关闭时自动移除 Unix 套接字。(由 Pierre Ossman 在 gh-111246 中贡献。)DatagramTransport.sendto()
现在在调用空字节对象时将发送零长度数据报。传输流控制现在在计算缓冲区大小时也会考虑数据报头。(由 Jamie Phan 在 gh-115199 中贡献。)添加
Queue.shutdown
和QueueShutDown
以管理队列终止。(由 Laurie Opperman 和 Yves Duprat 在 gh-104228 中贡献。)添加
Server.close_clients()
和Server.abort_clients()
方法,它们更强制地关闭 asyncio 服务器。(由 Pierre Ossman 在 gh-113538 中贡献。)StreamReader.readuntil()
现在接受一个分隔符元组,在遇到其中任何一个时停止。(由 Bruce Merry 在 gh-81322 中贡献。)改进
TaskGroup
在外部取消与内部取消冲突时的行为。例如,当两个任务组嵌套并且两者同时在子任务中发生异常时,外部任务组可能会挂起,因为其内部取消被内部任务组吞噬了。在任务组被外部取消并且还必须引发
ExceptionGroup
的情况下,它现在将调用父任务的cancel()
方法。这确保CancelledError
将在下一个await
处引发,因此取消不会丢失。这些更改的另一个好处是,任务组现在保留取消计数(
cancelling()
)。为了处理一些极端情况,当取消计数达到零时,
uncancel()
现在可能会重置未文档化的_must_cancel
标志。(受 Arthur Tacca 在 gh-116720 中报告的问题启发。)
当在非活动
TaskGroup
上调用TaskGroup.create_task()
时,给定的协程将被关闭(这可以防止关于给定协程从未等待的RuntimeWarning
)。(由 Arthur Tacca 和 Jason Zhang 在 gh-115957 中贡献。)名为
create_task
的函数和方法已收到一个新的**kwargs
参数,该参数将传递给任务构造函数。此更改在 3.13.3 中意外添加,并破坏了自定义任务工厂的 API 约定。一些第三方任务工厂为此实现了变通方法。在 3.13.4 及更高版本中,旧的工厂约定再次得到遵守(直到 3.14)。为了使变通方法继续工作,额外的**kwargs
参数仍然允许向Task
和自定义任务工厂传递额外的关键字参数。这会影响以下函数和方法:
asyncio.create_task()
、asyncio.loop.create_task()
、asyncio.TaskGroup.create_task()
。(由 Thomas Grainger 在 gh-128307 中贡献。)
base64¶
添加
z85encode()
和z85decode()
函数,用于将bytes
编码为 Z85 数据,并将 Z85 编码数据解码为bytes
。(由 Matan Perelman 在 gh-75299 中贡献。)
compileall¶
现在使用
os.process_cpu_count()
而不是os.cpu_count()
选择默认的 worker 线程和进程数。(由 Victor Stinner 在 gh-109649 中贡献。)
concurrent.futures¶
现在使用
os.process_cpu_count()
而不是os.cpu_count()
选择默认的 worker 线程和进程数。(由 Victor Stinner 在 gh-109649 中贡献。)
configparser¶
ConfigParser
现在支持无名节,这允许顶级键值对。这可以通过新的 allow_unnamed_section 参数启用。(由 Pedro Sousa Lacerda 在 gh-66449 中贡献。)
copy¶
新的
replace()
函数和replace protocol
使创建修改后的对象副本变得简单得多。这在处理不可变对象时特别有用。以下类型支持replace()
函数并实现了 replace 协议:任何用户定义的类也可以通过定义
__replace__()
方法来支持copy.replace()
。(由 Serhiy Storchaka 在 gh-108751 中贡献。)
ctypes¶
由于必要的内部重构,内部元类的初始化现在在
__init__
中发生,而不是在__new__
中。这会影响子类化这些内部元类以提供自定义初始化的项目。通常:在调用
super().__new__
之后在__new__
中完成的自定义逻辑应移至__init__
。要创建类,请调用元类,而不仅仅是元类的
__new__
方法。
有关一些受影响项目中的讨论和更改链接,请参阅 gh-124520。
ctypes.Structure
对象有一个新的_align_
属性,它允许明确指定结构从内存打包/解包时的对齐方式。(由 Matt Sanderson 在 gh-112433 中贡献)
dbm¶
添加
dbm.sqlite3
,这是一个实现 SQLite 后端的新模块,并使其成为默认的dbm
后端。(由 Raymond Hettinger 和 Erlend E. Aasland 在 gh-100414 中贡献。)允许通过 GDBM 和 NDBM 数据库对象的新
clear()
方法从数据库中删除所有项目。(由 Donghee Na 在 gh-107122 中贡献。)
dis¶
更改
dis
模块函数的输出,以显示跳转目标和异常处理程序的逻辑标签,而不是偏移量。偏移量可以使用新的-O
命令行选项或 show_offsets 参数添加。(由 Irit Katriel 在 gh-112137 中贡献。)get_instructions()
不再将缓存条目表示为单独的指令。相反,它将它们作为Instruction
的一部分返回,在新的 cache_info 字段中。传递给get_instructions()
的 show_caches 参数已弃用,并且不再有任何效果。(由 Irit Katriel 在 gh-112962 中贡献。)
doctest¶
doctest
输出现在默认有颜色。这可以通过新的PYTHON_COLORS
环境变量以及规范的NO_COLOR
和FORCE_COLOR
环境变量进行控制。另请参阅 控制颜色。(由 Hugo van Kemenade 在 gh-117225 中贡献。)DocTestRunner.run()
方法现在计算跳过的测试数量。添加了DocTestRunner.skips
和TestResults.skipped
属性。(由 Victor Stinner 在 gh-108794 中贡献。)
email¶
现在,输出中包含换行符的标头将用引号括起来。
generator
现在将拒绝序列化(写入)格式不正确或分隔不当的标头,以免它们被解析为多个标头或与相邻数据连接。如果需要关闭此安全功能,请设置verify_generated_headers
。(由 Bas Bloemsaat 和 Petr Viktorin 在 gh-121650 中贡献。)getaddresses()
和parseaddr()
现在在遇到无效电子邮件地址的更多情况下返回('', '')
对,而不是可能不准确的值。这两个函数都有一个新的可选 strict 参数(默认为True
)。要获取旧行为(接受格式错误输入),请使用strict=False
。getattr(email.utils, 'supports_strict_parsing', False)
可用于检查 strict 参数是否可用。(由 Thomas Dwyer 和 Victor Stinner 为 gh-102988 贡献,以改进CVE 2023-27043 修复。)
enum¶
fractions¶
glob¶
添加
translate()
,一个用于将带有 shell 风格通配符的路径规范转换为正则表达式的函数。(由 Barney Gale 在 gh-72904 中贡献。)
importlib¶
importlib.resources
中的以下函数现在允许通过使用多个位置参数(文本读取函数中的 encoding 和 errors 参数现在仅为关键字参数)访问资源目录(或树)这些函数不再被弃用,并且没有计划移除。(由 Petr Viktorin 在 gh-116608 中贡献。)
contents()
仍被弃用,转而使用功能齐全的Traversable
API。然而,目前没有计划移除它。(由 Petr Viktorin 在 gh-116608 中贡献。)
io¶
IOBase
终结器现在使用sys.unraisablehook
记录close()
方法引发的任何错误。以前,默认情况下错误会被静默忽略,并且只在 Python 开发模式 或使用 Python 调试构建 时记录。(由 Victor Stinner 在 gh-62948 中贡献。)
ipaddress¶
添加
IPv4Address.ipv6_mapped
属性,它返回 IPv4 映射的 IPv6 地址。(由 Charles Machalow 在 gh-109466 中贡献。)修复
IPv4Address
、IPv6Address
、IPv4Network
和IPv6Network
中的is_global
和is_private
行为。(由 Jakub Stasiak 在 gh-113171 中贡献。)
itertools¶
batched()
有一个新的 strict 参数,如果最终批次短于指定的批次大小,则会引发ValueError
。(由 Raymond Hettinger 在 gh-113202 中贡献。)
marshal¶
在模块函数中添加 allow_code 参数。传递
allow_code=False
可防止序列化和反序列化在 Python 版本之间不兼容的代码对象。(由 Serhiy Storchaka 在 gh-113626 中贡献。)
math¶
mimetypes¶
添加
guess_file_type()
函数,用于从文件系统路径猜测 MIME 类型。现在使用guess_type()
的路径 软弃用。(由 Serhiy Storchaka 在 gh-66543 中贡献。)
mmap¶
mmap
现在受到保护,防止在 Windows 上由于文件系统错误或访问冲突导致映射内存不可访问时崩溃。(由 Jannis Weigend 在 gh-118209 中贡献。)mmap
有一个新的seekable()
方法,当需要可查找的文件类对象时可以使用它。seek()
方法现在返回新的绝对位置。(由 Donghee Na 和 Sylvie Liberman 在 gh-111835 中贡献。)mmap
新增的仅限 UNIX 的 trackfd 参数控制文件描述符复制;如果为 false,则 fileno 指定的文件描述符将不被复制。(由 Zackery Spytz 和 Petr Viktorin 在 gh-78502 中贡献。)
multiprocessing¶
现在使用
os.process_cpu_count()
而不是os.cpu_count()
选择默认的 worker 线程和进程数。(由 Victor Stinner 在 gh-109649 中贡献。)
os¶
添加
process_cpu_count()
函数,用于获取当前进程的调用线程可用的逻辑 CPU 核心数。(由 Victor Stinner 在 gh-109649 中贡献。)cpu_count()
和process_cpu_count()
可以通过新的环境变量PYTHON_CPU_COUNT
或新的命令行选项-X cpu_count
覆盖。此选项对于需要限制容器系统 CPU 资源而无需修改应用程序代码或容器本身的用户非常有用。(由 Donghee Na 在 gh-109595 中贡献。)通过
timerfd_create()
、timerfd_settime()
、timerfd_settime_ns()
、timerfd_gettime()
、timerfd_gettime_ns()
、TFD_NONBLOCK
、TFD_CLOEXEC
、TFD_TIMER_ABSTIME
和TFD_TIMER_CANCEL_ON_SET
添加了 Linux 定时器文件描述符 的 低级接口。(由 Masaru Tsuchiyama 在 gh-108277 中贡献。)lchmod()
和chmod()
的 follow_symlinks 参数现在都可在 Windows 上使用。请注意,在 Windows 上,lchmod()
中 follow_symlinks 的默认值为False
。(由 Serhiy Storchaka 在 gh-59616 中贡献。)fchmod()
和chmod()
中对文件描述符的支持现在都可在 Windows 上使用。(由 Serhiy Storchaka 在 gh-113191 中贡献。)在 Windows 上,
mkdir()
和makedirs()
现在支持传递0o700
的 mode 值以对新目录应用访问控制。这隐式影响tempfile.mkdtemp()
,并且是 CVE 2024-4030 的缓解措施。mode 的其他值将继续被忽略。(由 Steve Dower 在 gh-118486 中贡献。)posix_spawn()
现在接受 env 参数为None
,这将使新生成进程使用当前进程环境。(由 Jakub Kulik 在 gh-113119 中贡献。)posix_spawn()
现在可以在支持posix_spawn_file_actions_addclosefrom_np()
的平台上,在 file_actions 参数中使用POSIX_SPAWN_CLOSEFROM
属性。(由 Jakub Kulik 在 gh-113117 中贡献。)
os.path¶
添加
isreserved()
以检查路径是否在当前系统上保留。此函数仅在 Windows 上可用。(由 Barney Gale 在 gh-88569 中贡献。)在 Windows 上,
isabs()
不再将以恰好一个斜杠(\
或/
)开头的路径视为绝对路径。(由 Barney Gale 和 Jon Foster 在 gh-44626 中贡献。)realpath()
现在即使文件不可访问,也会解析 MS-DOS 风格的文件名。(由 Moonsik Park 在 gh-82367 中贡献。)
pathlib¶
添加
UnsupportedOperation
,当路径操作不支持时,它将代替NotImplementedError
引发。(由 Barney Gale 在 gh-89812 中贡献。)添加一个用于从“file”URI (
file:///
) 创建Path
对象的新构造函数Path.from_uri()
。(由 Barney Gale 在 gh-107465 中贡献。)添加
PurePath.full_match()
,用于使用 shell 风格通配符匹配路径,包括递归通配符“**
”。(由 Barney Gale 在 gh-73435 中贡献。)添加
PurePath.parser
类属性,用于存储用于低级路径解析和连接的os.path
实现。这将是posixpath
或ntpath
。向
Path.glob()
和rglob()
添加 recurse_symlinks 仅限关键字参数。(由 Barney Gale 在 gh-77609 中贡献。)Path.glob()
和rglob()
现在当给定以“**
”结尾的模式时,返回文件和目录。以前,只返回目录。(由 Barney Gale 在 gh-70303 中贡献。)向
Path.is_file
、Path.is_dir
、Path.owner()
和Path.group()
添加 follow_symlinks 仅限关键字参数。(由 Barney Gale 在 gh-105793 和 Kamil Turek 在 gh-107962 中贡献。)
pdb¶
breakpoint()
和set_trace()
现在立即进入调试器,而不是在下一行代码执行时。此更改可防止调试器在breakpoint()
位于上下文末尾时跳出上下文。(由 Tian Gao 在 gh-118579 中贡献。)当
sys.flags.safe_path
设置时,sys.path[0]
不再被调试脚本的目录替换。(由 Tian Gao 和 Christian Walther 在 gh-111762 中贡献。)在
pm()
中,通过新的 Pdb 命令exceptions [exc_number]
,增加了在事后调试期间在链式异常之间移动的功能。(由 Matthias Bussonnier 在 gh-106676 中贡献。)前缀为 pdb 命令的表达式和语句现在可以正确识别和执行。(由 Tian Gao 在 gh-108464 中贡献。)
queue¶
添加
Queue.shutdown
和ShutDown
来管理队列终止。(由 Laurie Opperman 和 Yves Duprat 在 gh-104750 中贡献。)
random¶
re¶
为了提高清晰度,将
re.error
重命名为PatternError
。re.error
保留以实现向后兼容性。
shutil¶
site¶
sqlite3¶
如果
Connection
对象未显式closed
,则现在会发出ResourceWarning
。(由 Erlend E. Aasland 在 gh-105539 中贡献。)向
Connection.iterdump()
添加 filter 仅限关键字参数,用于过滤要转储的数据库对象。(由 Mariusz Felisiak 在 gh-91602 中贡献。)
ssl¶
create_default_context()
API 现在在其默认标志中包含VERIFY_X509_PARTIAL_CHAIN
和VERIFY_X509_STRICT
。备注
VERIFY_X509_STRICT
可能会拒绝 OpenSSL 底层实现原本可能接受的 pre-RFC 5280 或格式错误的证书。虽然不建议禁用此功能,但您可以使用以下方法实现:import ssl ctx = ssl.create_default_context() ctx.verify_flags &= ~ssl.VERIFY_X509_STRICT
(由 William Woodruff 在 gh-112389 中贡献。)
statistics¶
添加
kde()
用于核密度估计。这使得可以从固定数量的离散样本估计连续概率密度函数。(由 Raymond Hettinger 在 gh-115863 中贡献。)添加
kde_random()
用于从kde()
创建的估计概率密度函数进行采样。(由 Raymond Hettinger 在 gh-115863 中贡献。)
subprocess¶
subprocess
模块现在在更多情况下使用posix_spawn()
函数。值得注意的是,当 close_fds 为
True
(默认值)时,如果 C 库提供posix_spawn_file_actions_addclosefrom_np()
,将使用posix_spawn()
,这包括最新版本的 Linux、FreeBSD 和 Solaris。在 Linux 上,这应该与现有的基于 Linuxvfork()
的代码性能相似。如果需要强制
subprocess
从不使用posix_spawn()
,可以将私有控制旋钮subprocess._USE_POSIX_SPAWN
设置为False
。如果您设置了此值,请在 问题跟踪器 中报告您的原因和平台详细信息,以便我们为所有人改进 API 选择逻辑。(由 Jakub Kulik 在 gh-113117 中贡献。)
sys¶
添加
_is_interned()
函数,用于测试字符串是否已被 intern。此函数不保证存在于所有 Python 实现中。(由 Serhiy Storchaka 在 gh-78573 中贡献。)
tempfile¶
在 Windows 上,由于
os.mkdir()
的更改,tempfile.mkdtemp()
使用的默认模式0o700
现在限制对新目录的访问。这是 CVE 2024-4030 的缓解措施。(由 Steve Dower 在 gh-118486 中贡献。)
时间¶
在 Windows 上,
monotonic()
现在使用QueryPerformanceCounter()
时钟,分辨率为 1 微秒,而不是分辨率为 15.6 毫秒的GetTickCount64()
时钟。(由 Victor Stinner 在 gh-88494 中贡献。)在 Windows 上,
time()
现在使用GetSystemTimePreciseAsFileTime()
时钟,分辨率为 1 微秒,而不是分辨率为 15.6 毫秒的GetSystemTimeAsFileTime()
时钟。(由 Victor Stinner 在 gh-63207 中贡献。)
tkinter¶
添加
tkinter
小部件方法:tk_busy_hold()
、tk_busy_configure()
、tk_busy_cget()
、tk_busy_forget()
、tk_busy_current()
和tk_busy_status()
。(由 Miguel、klappnase 和 Serhiy Storchaka 在 gh-72684 中贡献。)tkinter
小部件方法wm_attributes()
现在接受不带减号前缀的属性名称以获取窗口属性,例如w.wm_attributes('alpha')
,并允许将属性和要设置的值指定为关键字参数,例如w.wm_attributes(alpha=0.5)
。(由 Serhiy Storchaka 在 gh-43457 中贡献。)wm_attributes()
现在可以通过使用新的可选关键字参数 return_python_dict 将属性作为dict
返回。(由 Serhiy Storchaka 在 gh-43457 中贡献。)当使用新的可选关键字参数 return_ints 时,
Text.count()
现在可以返回一个简单的int
。否则,单个计数将作为 1 元组或None
返回。(由 Serhiy Storchaka 在 gh-97928 中贡献。)在
tkinter.ttk.Style
的element_create()
方法中支持“vsapi”元素类型。(由 Serhiy Storchaka 在 gh-68166 中贡献。)为 Tkinter 小部件添加
after_info()
方法。(由 Cheryl Sabella 在 gh-77020 中贡献。)向
PhotoImage
添加了一个新的copy_replace()
方法,用于将一个图像的区域复制到另一个图像,可能带有像素缩放、二次采样或两者兼有。(由 Serhiy Storchaka 在 gh-118225 中贡献。)向
PhotoImage
方法copy()
、zoom()
和subsample()
添加 from_coords 参数。向PhotoImage
方法copy()
添加 zoom 和 subsample 参数。(由 Serhiy Storchaka 在 gh-118225 中贡献。)添加
PhotoImage
方法read()
以从文件读取图像,以及data()
以获取图像数据。向write()
方法添加 background 和 grayscale 参数。(由 Serhiy Storchaka 在 gh-118271 中贡献。)
traceback¶
向
TracebackException
添加exc_type_str
属性,它包含 exc_type 的字符串显示。弃用exc_type
属性,它包含类型对象本身。添加参数 save_exc_type(默认True
)以指示是否应保存exc_type
。(由 Irit Katriel 在 gh-112332 中贡献。)向
TracebackException.format_exception_only()
添加一个新的 show_group 仅限关键字参数,用于(递归地)格式化BaseExceptionGroup
实例的嵌套异常。(由 Irit Katriel 在 gh-105292 中贡献。)
types¶
SimpleNamespace
现在可以接受单个位置参数来初始化命名空间的参数。此参数必须是映射或键值对的可迭代对象。(由 Serhiy Storchaka 在 gh-108191 中贡献。)
typing¶
添加
NoDefault
,一个哨兵对象,用于表示typing
模块中某些参数的默认值。(由 Jelle Zijlstra 在 gh-116126 中贡献。)添加
get_protocol_members()
以返回定义typing.Protocol
的成员集。(由 Jelle Zijlstra 在 gh-104873 中贡献。)添加
is_protocol()
以检查类是否是Protocol
。(由 Jelle Zijlstra 在 gh-104873 中贡献。)ClassVar
现在可以嵌套在Final
中,反之亦然。(由 Mehdi Drissi 在 gh-89547 中贡献。)
unicodedata¶
venv¶
添加对在虚拟环境目录中创建源代码控制管理 (SCM) 忽略文件的支持。默认情况下,支持 Git。这通过 API 作为可选功能实现,可以扩展以支持其他 SCM(
EnvBuilder
和create()
),并通过 CLI 使用--without-scm-ignore-files
作为可选退出功能。(由 Brett Cannon 在 gh-108125 中贡献。)
warnings¶
PEP 702:新的
warnings.deprecated()
装饰器提供了一种将弃用情况传达给 静态类型检查器 的方法,并在使用弃用的类和函数时发出警告。在运行时使用装饰函数或类时,也可能发出DeprecationWarning
。(由 Jelle Zijlstra 在 gh-104003 中贡献。)
xml¶
允许控制 Expat >=2.6.0 重解析延迟(CVE 2023-52425),通过添加五个新方法:
xml.sax.expatreader.ExpatParser.flush()
(由 Sebastian Pipping 在 gh-115623 中贡献。)
为
iterparse()
返回的迭代器添加close()
方法,用于显式清理。(由 Serhiy Storchaka 在 gh-69893 中贡献。)
zipimport¶
优化¶
几个标准库模块的导入时间得到了显著改善。例如,通过移除对
re
和contextlib
的依赖,typing
模块的导入时间减少了大约三分之一。其他导入时间得到加速的模块包括email.utils
、enum
、functools
、importlib.metadata
和threading
。(由 Alex Waygood、Shantanu Jain、Adam Turner、Daniel Hollas 等人在 gh-109653 中贡献。)对于大型输入,
textwrap.indent()
现在比以前快约 30%。(由 Inada Naoki 在 gh-107369 中贡献。)subprocess
模块现在在更多情况下使用posix_spawn()
函数,包括在许多现代平台上 close_fds 为True
(默认值)时。这应该会在 FreeBSD 和 Solaris 上启动进程时提供显著的性能提升。有关详细信息,请参阅上面的 subprocess 部分。(由 Jakub Kulik 在 gh-113117 中贡献。)
已移除的模块和 API¶
PEP 594:从标准库中移除“死电池”¶
PEP 594 提议从标准库中移除 19 个模块,俗称“死电池”,因为它们具有历史性、过时或不安全的地位。以下所有模块在 Python 3.11 中已弃用,现在已被移除:
aifc
standard-aifc:使用 PyPI 中
aifc
库的重新分发版本。
audioop
audioop-lts:使用 PyPI 中
audioop-lts
库。
chunk
standard-chunk:使用 PyPI 中
chunk
库的重新分发版本。
cgi
和cgitb
cgi.FieldStorage
通常可以替换为urllib.parse.parse_qsl()
用于GET
和HEAD
请求,以及email.message
模块或 multipart 库用于POST
和PUT
请求。cgi.parse()
可以通过直接在所需的查询字符串上调用urllib.parse.parse_qs()
来替换,除非输入是multipart/form-data
,这应该按照cgi.parse_multipart()
的描述进行替换。cgi.parse_header()
可以替换为email
包中的功能,它实现了相同的 MIME RFC。例如,使用email.message.EmailMessage
from email.message import EmailMessage msg = EmailMessage() msg['content-type'] = 'application/json; charset="utf8"' main, params = msg.get_content_type(), msg['content-type'].params
cgi.parse_multipart()
可以替换为email
包中的功能,它实现了相同的 MIME RFC,或者使用 multipart 库。例如,email.message.EmailMessage
和email.message.Message
类。standard-cgi:和 standard-cgitb:使用 PyPI 中
cgi
和cgitb
库的重新分发版本。
crypt
和私有_crypt
扩展。当只需要对值进行哈希时,hashlib
模块可能是合适的替代品。否则,PyPI 上有各种第三方库可用:bcrypt:适用于您的软件和服务器的现代密码哈希。
argon2-cffi:安全的 Argon2 密码哈希算法。
legacycrypt:
ctypes
包装器,用于 POSIX crypt 库调用和相关功能。crypt_r:
crypt
模块的分支,包装器,用于 crypt_r(3) 库调用和相关功能。standard-crypt 和 deprecated-crypt-alternative:使用 PyPI 中
crypt
库的重新分发版本和_crypt
库的重新实现。
imghdr
:应使用 filetype、puremagic 或 python-magic 库作为替代品。例如,puremagic.what()
函数可用于替换imghdr.what()
函数,适用于imghdr
支持的所有文件格式。standard-imghdr:使用 PyPI 中
imghdr
库的重新分发版本。
mailcap
:请改用mimetypes
模块。standard-mailcap:使用 PyPI 中
mailcap
库的重新分发版本。
msilib
nis
nntplib
:请改用 PyPI 中的 pynntp 库。standard-nntplib:使用 PyPI 中
nntplib
库的重新分发版本。
ossaudiodev
:对于音频播放,请改用 PyPI 中的 pygame 库。pipes
:请改用subprocess
模块。使用shlex.quote()
替换未文档化的pipes.quote
函数。standard-pipes:使用 PyPI 中
pipes
库的重新分发版本。
sndhdr
:应使用 filetype、puremagic 或 python-magic 库作为替代品。standard-sndhdr:使用 PyPI 中
sndhdr
库的重新分发版本。
spwd
:请改用 PyPI 中的 python-pam 库。sunau
standard-sunau:使用 PyPI 中
sunau
库的重新分发版本。
telnetlib
:请改用 PyPI 中的 telnetlib3 或 Exscript 库。standard-telnetlib:使用 PyPI 中
telnetlib
库的重新分发版本。
uu
:请改用base64
模块作为现代替代方案。standard-uu:使用 PyPI 中
uu
库的重新分发版本。
xdrlib
standard-xdrlib:使用 PyPI 中
xdrlib
库的重新分发版本。
(由 Victor Stinner 和 Zachary Ware 在 gh-104773 和 gh-104780 中贡献。)
2to3¶
移除 2to3 程序和
lib2to3
模块,此前已在 Python 3.11 中弃用。(由 Victor Stinner 在 gh-104780 中贡献。)
builtins¶
移除对链式
classmethod
描述符的支持(在 gh-63272 中引入)。这些描述符不能再用于包装其他描述符,例如property
。此功能的核心设计存在缺陷并导致了几个问题。要“穿透”一个classmethod
,请考虑使用 Python 3.10 中添加的__wrapped__
属性。(由 Raymond Hettinger 在 gh-89519 中贡献。)当在挂起的帧上调用
frame.clear()
时,会引发RuntimeError
(执行中的帧始终如此)。(由 Irit Katriel 在 gh-79932 中贡献。)
configparser¶
移除未文档化的
LegacyInterpolation
类,该类自 Python 3.2 起在文档字符串中弃用,自 Python 3.11 起在运行时弃用。(由 Hugo van Kemenade 在 gh-104886 中贡献。)
importlib.metadata¶
移除对 EntryPoint 对象的已弃用的下标(
__getitem__()
)访问。(由 Jason R. Coombs 在 gh-113175 中贡献。)
locale¶
移除
locale.resetlocale()
函数,该函数在 Python 3.11 中已弃用。请改用locale.setlocale(locale.LC_ALL, "")
。(由 Victor Stinner 在 gh-104783 中贡献。)
opcode¶
optparse¶
pathlib¶
re¶
移除了未文档化、已弃用且损坏的
re.template()
函数和re.TEMPLATE
/re.T
标志。(由 Serhiy Storchaka 和 Nikita Sobolev 在 gh-105687 中贡献。)
tkinter.tix¶
移除了
tkinter.tix
模块,该模块在 Python 3.6 中已弃用。该模块封装的第三方 Tix 库已不再维护。(由 Zachary Ware 在 gh-75552 中贡献。)
turtle¶
移除了
RawTurtle.settiltangle()
方法,该方法自 Python 3.1 起在文档中弃用,自 Python 3.11 起在运行时弃用。(由 Hugo van Kemenade 在 gh-104876 中贡献。)
typing¶
unittest¶
移除了以下
unittest
函数,这些函数在 Python 3.11 中已弃用unittest.findTestCases()
unittest.makeSuite()
unittest.getTestCaseNames()
请改用
TestLoader
方法(由 Hugo van Kemenade 在 gh-104835 中贡献。)
移除了未经测试且未文档化的
TestProgram.usageExit()
方法,该方法在 Python 3.11 中已弃用。(由 Hugo van Kemenade 在 gh-104992 中贡献。)
urllib¶
移除了
urllib.request.urlopen()
函数的 cafile、capath 和 cadefault 参数,这些参数在 Python 3.6 中已弃用。请改用带有SSLContext
实例的 context 参数。ssl.SSLContext.load_cert_chain()
函数可用于加载特定证书,或者让ssl.create_default_context()
选择操作系统的受信任证书颁发机构 (CA) 证书。(由 Victor Stinner 在 gh-105382 中贡献。)
webbrowser¶
移除了未经测试且未文档化的
MacOSX
类,该类在 Python 3.11 中已弃用。请改用MacOSXOSAScript
类(在 Python 3.2 中引入)。(由 Hugo van Kemenade 在 gh-104804 中贡献。)移除了已弃用的
MacOSXOSAScript._name
属性。请改用MacOSXOSAScript.name
属性。(由 Nikita Sobolev 在 gh-105546 中贡献。)
新弃用¶
dis
:-
弃用在
gettext
模块中,即使未找到翻译,将非整数数字作为考虑复数形式的函数和方法的参数的做法。(由 Serhiy Storchaka 在 gh-88434 中贡献。)
glob
:弃用未文档化的
glob0()
和glob1()
函数。请改用glob()
并向 root_dir 参数传递指定根目录的 类路径对象。(由 Barney Gale 在 gh-117337 中贡献。)
-
弃用
CGIHTTPRequestHandler
,该类将在 Python 3.15 中移除。基于进程的 CGI HTTP 服务器已经失宠很长时间了。此代码已过时、未维护且很少使用。它具有很高的安全性和功能错误潜力。(由 Gregory P. Smith 在 gh-109096 中贡献。)弃用 python -m http.server 命令行界面的
--cgi
标志,该标志将在 Python 3.15 中移除。(由 Gregory P. Smith 在 gh-109096 中贡献。)
-
软弃用 传递文件路径参数给
guess_type()
,请改用guess_file_type()
。(由 Serhiy Storchaka 在 gh-66543 中贡献。)
re
:-
弃用
PurePath.is_reserved()
,该方法将在 Python 3.15 中移除。请使用os.path.isreserved()
在 Windows 上检测保留路径。(由 Barney Gale 在 gh-88569 中贡献。)
-
弃用
java_ver()
,该函数将在 Python 3.15 中移除。此函数仅对 Jython 支持有用,API 令人困惑,且大部分未经测试。(由 Nikita Sobolev 在 gh-116349 中贡献。)
-
弃用未文档化的
ispackage()
函数。(由 Zackery Spytz 在 gh-64020 中贡献。)
-
弃用向
connect()
函数和Connection
构造函数传递多个位置参数的做法。其余参数将在 Python 3.15 中变为仅限关键字。(由 Erlend E. Aasland 在 gh-107948 中贡献。)弃用将名称、参数数量和可调用对象作为关键字参数传递给
Connection.create_function()
和Connection.create_aggregate()
的做法。这些参数将在 Python 3.15 中变为仅限位置。(由 Erlend E. Aasland 在 gh-108278 中贡献。)弃用将回调可调用对象作为关键字传递给
set_authorizer()
、set_progress_handler()
和set_trace_callback()
Connection
方法的做法。回调可调用对象将在 Python 3.15 中变为仅限位置。(由 Erlend E. Aasland 在 gh-108278 中贡献。)
sys
:弃用
_enablelegacywindowsfsencoding()
函数,该函数将在 Python 3.16 中移除。请改用PYTHONLEGACYWINDOWSFSENCODING
环境变量。(由 Inada Naoki 在 gh-73427 中贡献。)
-
弃用未文档化且未使用的
TarFile.tarfile
属性,该属性将在 Python 3.16 中移除。(在 gh-115256 中贡献。)
-
弃用
TracebackException.exc_type
属性。请改用TracebackException.exc_type_str
。(由 Irit Katriel 在 gh-112332 中贡献。)
-
弃用创建
NamedTuple
类的未文档化关键字参数语法(例如Point = NamedTuple("Point", x=int, y=int)
),该语法将在 Python 3.15 中移除。请改用基于类的语法或函数式语法。(由 Alex Waygood 在 gh-105566 中贡献。)弃用创建
NamedTuple
或typing.TypedDict
类时省略 fields 参数,并弃用向这两种类型的 fields 参数传递None
。Python 3.15 将要求 fields 参数为有效的序列。要创建零字段的 NamedTuple 类,请使用class NT(NamedTuple): pass
或NT = NamedTuple("NT", ())
。要创建零字段的 TypedDict 类,请使用class TD(TypedDict): pass
或TD = TypedDict("TD", {})
。(由 Alex Waygood 在 gh-105566 和 gh-105570 中贡献。)弃用
typing.no_type_check_decorator()
装饰器函数,该函数将在 Python 3.15 中移除。在typing
模块中存在八年之后,它尚未得到任何主要类型检查器的支持。(由 Alex Waygood 在 gh-106309 中贡献。)弃用
typing.AnyStr
。在 Python 3.16 中,它将从typing.__all__
中移除,并在导入或访问时在运行时发出DeprecationWarning
。它将在 Python 3.18 中完全移除。请改用新的 类型参数语法。(由 Michael The 在 gh-107116 中贡献。)
wave
:弃用
Wave_read
和Wave_write
类的getmark()
、setmark()
和getmarkers()
方法,这些方法将在 Python 3.15 中移除。(由 Victor Stinner 在 gh-105096 中贡献。)
Python 3.14 中即将移除¶
argparse
:argparse.BooleanOptionalAction
的 type、choices 和 metavar 参数已弃用,并将在 3.14 中移除。(由 Nikita Sobolev 在 gh-92248 中贡献。)ast
:以下功能自 Python 3.8 起在文档中弃用,现在在访问或使用时会在运行时发出DeprecationWarning
,并将在 Python 3.14 中移除ast.Num
ast.Str
ast.Bytes
ast.NameConstant
ast.Ellipsis
请改用
ast.Constant
。(由 Serhiy Storchaka 在 gh-90953 中贡献。)-
子进程观察器类
asyncio.MultiLoopChildWatcher
、asyncio.FastChildWatcher
、asyncio.AbstractChildWatcher
和asyncio.SafeChildWatcher
已弃用,并将在 Python 3.14 中移除。(由 Kumar Aditya 在 gh-94597 中贡献。)asyncio.set_child_watcher()
、asyncio.get_child_watcher()
、asyncio.AbstractEventLoopPolicy.set_child_watcher()
和asyncio.AbstractEventLoopPolicy.get_child_watcher()
已弃用,并将在 Python 3.14 中移除。(由 Kumar Aditya 在 gh-94597 中贡献。)如果未设置当前事件循环,且默认事件循环策略的
get_event_loop()
方法决定创建一个事件循环,则现在会发出DeprecationWarning
。(由 Serhiy Storchaka 和 Guido van Rossum 在 gh-100160 中贡献。)
email
:弃用email.utils.localtime()
中的 isdst 参数。(由 Alan Williams 在 gh-72346 中贡献。)importlib.abc
弃用类importlib.abc.ResourceReader
importlib.abc.Traversable
importlib.abc.TraversableResources
请改用
importlib.resources.abc
类(由 Jason R. Coombs 和 Hugo van Kemenade 在 gh-93963 中贡献。)
itertools
对复制、深层复制和 pickle 操作的支持未文档化、效率低下、历史上有 bug 且不一致。为了大幅减少代码量和维护负担,此功能将在 3.14 中移除。(由 Raymond Hettinger 在 gh-101588 中贡献。)multiprocessing
:在 Linux、BSD 和其他非 macOS POSIX 平台上,默认的启动方法将更改为更安全的方法,目前这些平台默认使用'fork'
(gh-84559)。添加运行时警告被认为会造成太大干扰,因为预计大多数代码不会在意。请使用get_context()
或set_start_method()
API 明确指定您的代码何时 *需要*'fork'
。请参阅 上下文和启动方法。pathlib
:is_relative_to()
和relative_to()
:传递额外参数已弃用。pkgutil
:pkgutil.find_loader()
和pkgutil.get_loader()
现在会引发DeprecationWarning
;请改用importlib.util.find_spec()
。(由 Nikita Sobolev 在 gh-97850 中贡献。)pty
:master_open()
:请改用pty.openpty()
。slave_open()
:请改用pty.openpty()
。
-
version
和version_info
。execute()
和executemany()
如果使用 命名占位符 并且 parameters 是序列而不是dict
。
urllib
:urllib.parse.Quoter
已弃用:它无意作为公共 API。(由 Gregory P. Smith 在 gh-88168 中贡献。)
计划在 Python 3.15 中移除¶
导入系统
在设置模块的
__cached__
属性时,若未同时设置__spec__.cached
,此行为已被弃用。在 Python 3.15 中,导入系统或标准库将不再设置或考虑__cached__
属性。(由 gh-97879 贡献)在设置模块的
__package__
属性时,若未同时设置__spec__.parent
,此行为已被弃用。在 Python 3.15 中,导入系统或标准库将不再设置或考虑__package__
属性。(由 gh-97879 贡献)
-
未写入文档的
ctypes.SetPointerType()
函数自 Python 3.13 起已被弃用。
-
过时且很少使用的
CGIHTTPRequestHandler
已从 Python 3.13 开始弃用。没有直接的替代品。任何将 Web 服务器与请求处理程序对接的方式都比 CGI 好。python -m http.server 命令行界面的
--cgi
旗标已自 Python 3.13 起弃用。
-
load_module()
方法:请改用exec_module()
。
-
getdefaultlocale()
函数自 Python 3.11 起已弃用。原计划在 Python 3.13 中移除 (gh-90817),但已推迟到 Python 3.15。请改用getlocale()
、setlocale()
和getencoding()
。(由 Hugo van Kemenade 在 gh-111187 中贡献。)
-
PurePath.is_reserved()
已自 Python 3.13 起弃用。要检测 Windows 上的保留路径,请使用os.path.isreserved()
。
-
java_ver()
已自 Python 3.13 起弃用。此函数仅对 Jython 支持有用,其 API 令人困惑,且基本未经测试。
-
sysconfig.is_python_build()
的 check_home 参数已自 Python 3.12 起弃用。
-
RLock()
在 Python 3.15 中将不再接受任何参数。自 Python 3.14 起,传递任何参数的行为已被弃用,因为 Python 版本不允许任何参数,但 C 版本允许任意数量的位置或关键字参数,并会忽略所有参数。
-
types.CodeType
:访问co_lnotab
在 PEP 626 中自 3.10 起弃用,原计划在 3.12 中移除,但直到 3.12 才获得了适当的DeprecationWarning
。可能会在 3.15 中移除。(由 Nikita Sobolev 在 gh-101866 中贡献。)
-
用于创建
NamedTuple
类的未写入文档的关键字参数语法(例如,Point = NamedTuple("Point", x=int, y=int)
)已自 Python 3.13 起弃用。请改用基于类的语法或函数式语法。当使用
TypedDict
的函数式语法时,未向 fields 参数传递值 (TD = TypedDict("TD")
) 或传递None
(TD = TypedDict("TD", None)
) 已自 Python 3.13 起弃用。请使用class TD(TypedDict): pass
或TD = TypedDict("TD", {})
来创建零字段的 TypedDict。typing.no_type_check_decorator()
装饰器函数已自 Python 3.13 起弃用。在typing
模块中存在八年后,它仍未被任何主流类型检查器支持。
wave
:Wave_read
和Wave_write
类的getmark()
、setmark()
和getmarkers()
方法自 Python 3.13 起已弃用。
-
load_module()
已自 Python 3.10 起弃用。请改用exec_module()
。(由 Jiahao Li 在 gh-125746 中贡献。)
计划在 Python 3.16 中移除¶
导入系统
在设置模块的
__loader__
属性时,若未同时设置__spec__.loader
,此行为已被弃用。在 Python 3.16 中,导入系统或标准库将不再设置或考虑__loader__
属性。
-
'u'
格式代码(wchar_t
)自 Python 3.3 起在文档中被弃用,自 Python 3.13 起在运行时被弃用。请改用'w'
格式代码(Py_UCS4
)来处理 Unicode 字符。
-
asyncio.iscoroutinefunction()
已被弃用,并将在 Python 3.16 中移除;请改用inspect.iscoroutinefunction()
。(由 Jiahao Li 和 Kumar Aditya 在 gh-122875 中贡献。)asyncio
的策略系统已被弃用,并将在 Python 3.16 中移除。特别是,以下类和函数已被弃用:用户应使用
asyncio.run()
或带 loop_factory 参数的asyncio.Runner
来使用期望的事件循环实现。例如,在 Windows 上使用
asyncio.SelectorEventLoop
import asyncio async def main(): ... asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)
(由 Kumar Aditya 在 gh-127949 中贡献。)
-
对布尔类型进行按位取反(
~True
或~False
)的行为已自 Python 3.12 起弃用,因为它会产生令人惊讶且不直观的结果(-2
和-1
)。要对布尔值进行逻辑非运算,请改用not x
。在极少数情况下,如果您需要对底层整数进行按位取反,请显式转换为int
(~int(x)
)。
-
以关键字参数形式向
functools.reduce()
的 Python 实现传递 function 或 sequence 参数的做法已自 Python 3.14 起弃用。
-
对带有 strm 参数的自定义日志处理程序的支持已被弃用,并计划在 Python 3.16 中移除。请改用 stream 参数来定义处理程序。(由 Mariusz Felisiak 在 gh-115032 中贡献。)
-
对于
mimetypes.MimeTypes.add_type()
,有效的扩展名应以“.”开头或是空字符串。不带点的扩展名已被弃用,并将在 Python 3.16 中引发ValueError
。(由 Hugo van Kemenade 在 gh-75223 中贡献。)
-
ExecError
异常已自 Python 3.14 起弃用。自 Python 3.4 以来,shutil
中的任何函数都未使用过它,现在它是RuntimeError
的别名。
-
Class.get_methods
方法已自 Python 3.14 起弃用。
sys
:_enablelegacywindowsfsencoding()
函数自 Python 3.13 起已弃用。请改用PYTHONLEGACYWINDOWSFSENCODING
环境变量。
-
sysconfig.expand_makefile_vars()
函数已自 Python 3.14 起弃用。请改用sysconfig.get_paths()
的vars
参数。
-
未写入文档且未使用的
TarFile.tarfile
属性已自 Python 3.13 起弃用。
计划在 Python 3.17 中移除¶
-
collections.abc.ByteString
计划在 Python 3.17 中移除。要测试
obj
是否在运行时实现了缓冲区协议,请使用isinstance(obj, collections.abc.Buffer)
。在类型注解中,请使用Buffer
或显式指定代码支持的类型的联合类型(例如bytes | bytearray | memoryview
)。ByteString
最初旨在作为bytes
和bytearray
的超类型抽象类。然而,由于该 ABC 从未有任何方法,因此知道一个对象是ByteString
的实例实际上并未提供关于该对象的任何有用信息。其他常见的缓冲区类型(例如memoryview
)也从未被理解为ByteString
的子类型(无论是在运行时还是通过静态类型检查器)。
-
在 Python 3.14 之前,旧式联合类型是通过私有类
typing._UnionGenericAlias
实现的。该类对于实现已不再需要,但为了向后兼容而保留,并计划在 Python 3.17 中移除。用户应使用文档化的内省辅助工具,如typing.get_origin()
和typing.get_args()
,而不是依赖于私有实现细节。typing.ByteString
,自 Python 3.9 起已弃用,计划在 Python 3.17 中移除。要测试
obj
是否在运行时实现了缓冲区协议,请使用isinstance(obj, collections.abc.Buffer)
。在类型注解中,请使用Buffer
或显式指定代码支持的类型的联合类型(例如bytes | bytearray | memoryview
)。ByteString
最初旨在作为bytes
和bytearray
的超类型抽象类。然而,由于该 ABC 从未有任何方法,因此知道一个对象是ByteString
的实例实际上并未提供关于该对象的任何有用信息。其他常见的缓冲区类型(例如memoryview
)也从未被理解为ByteString
的子类型(无论是在运行时还是通过静态类型检查器)。
计划在未来版本中移除¶
以下 API 将在未来移除,但目前尚未确定移除日期。
-
嵌套参数组和嵌套互斥组的做法已被弃用。
向
add_argument_group()
传递未写入文档的关键字参数 prefix_chars 的做法现已弃用。argparse.FileType
类型转换器已被弃用。
-
生成器:
throw(type, exc, tb)
和athrow(type, exc, tb)
签名已被弃用:请改用单参数签名的throw(exc)
和athrow(exc)
。目前 Python 接受数字字面量紧跟关键字,例如
0in x
、1or x
、0if 1else 2
。它允许令人困惑和模棱两可的表达式,如[0x1for x in y]
(可解释为[0x1 for x in y]
或[0x1f or x in y]
)。如果数字字面量紧跟关键字and
、else
、for
、if
、in
、is
和or
之一,则会引发语法警告。在未来的版本中,这将更改为语法错误。( gh-87999 )对
__index__()
和__int__()
方法返回非 int 类型的支持:这些方法将被要求返回int
的严格子类的实例。对
__complex__()
方法返回complex
的严格子类的支持:这些方法将被要求返回complex
的实例。将
int()
委托给__trunc__()
方法的做法。在
complex()
构造函数中将复数作为 real 或 imag 参数传递的做法现已弃用;它应该仅作为单个位置参数传递。(由 Serhiy Storchaka 在 gh-109218 中贡献。)
calendar
:calendar.January
和calendar.February
常量已弃用,并由calendar.JANUARY
和calendar.FEBRUARY
取代。(由 Prince Roshan 在 gh-103636 中贡献。)codecs
:请使用open()
而不是codecs.open()
。(gh-133038)-
utcnow()
:请使用datetime.datetime.now(tz=datetime.UTC)
。utcfromtimestamp()
:请使用datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)
。
gettext
:复数值必须是整数。-
cache_from_source()
的 debug_override 参数已被弃用:请改用 optimization 参数。
-
EntryPoints
元组接口。返回值的隐式
None
。
mailbox
:使用 StringIO 输入和文本模式已被弃用,请改用 BytesIO 和二进制模式。os
:在多线程进程中调用os.register_at_fork()
。pydoc.ErrorDuringImport
:exc_info 参数使用元组值的做法已被弃用,请改用异常实例。re
:现在对正则表达式中的数字组引用和组名应用了更严格的规则。现在只接受 ASCII 数字序列作为数字引用。字节串模式和替换字符串中的组名现在只能包含 ASCII 字母、数字和下划线。(由 Serhiy Storchaka 在 gh-91760 中贡献。)sre_compile
、sre_constants
和sre_parse
模块。shutil
:rmtree()
的 onerror 参数在 Python 3.12 中已弃用;请改用 onexc 参数。ssl
选项和协议不带协议参数的
ssl.SSLContext
已被弃用。ssl.SSLContext
:set_npn_protocols()
和selected_npn_protocol()
已被弃用:请改用 ALPN。ssl.OP_NO_SSL*
选项ssl.OP_NO_TLS*
选项ssl.PROTOCOL_SSLv3
ssl.PROTOCOL_TLS
ssl.PROTOCOL_TLSv1
ssl.PROTOCOL_TLSv1_1
ssl.PROTOCOL_TLSv1_2
ssl.TLSVersion.SSLv3
ssl.TLSVersion.TLSv1
ssl.TLSVersion.TLSv1_1
threading
方法threading.Condition.notifyAll()
:请使用notify_all()
。threading.Event.isSet()
:请使用is_set()
。threading.Thread.isDaemon()
、threading.Thread.setDaemon()
:请使用threading.Thread.daemon
属性。threading.Thread.getName()
、threading.Thread.setName()
:请使用threading.Thread.name
属性。threading.currentThread()
:请使用threading.current_thread()
。threading.activeCount()
:请使用threading.active_count()
。
内部类
typing._UnionGenericAlias
不再用于实现typing.Union
。为了保持与使用此私有类的用户的兼容性,将提供一个兼容性垫片,至少持续到 Python 3.17。(由 Jelle Zijlstra 在 gh-105499 中贡献。)unittest.IsolatedAsyncioTestCase
:从测试用例返回非None
的值已被弃用。urllib.parse
中已弃用的函数:请改用urlparse()
splitattr()
splithost()
splitnport()
splitpasswd()
splitport()
splitquery()
splittag()
splittype()
splituser()
splitvalue()
to_bytes()
wsgiref
:SimpleHandler.stdout.write()
不应进行部分写入。xml.etree.ElementTree
:测试Element
的真值的做法已被弃用。在未来的版本中,它将始终返回True
。请优先使用显式的len(elem)
或elem is not None
测试。sys._clear_type_cache()
已被弃用:请改用sys._clear_internal_caches()
。
CPython 字节码更改¶
如果 yield 是 yield-from 或 await 的一部分,则
YIELD_VALUE
的操作码现为1
,否则为0
。RESUME
的操作码已更改,添加了一个位,指示 except-depth 是否为 1,这对于优化生成器的关闭是必需的。(由 Irit Katriel 在 gh-111354 中贡献。)
C API 更改¶
新功能¶
添加 PyMonitoring C API 用于生成 PEP 669 监控事件
PyMonitoring_FireBranchEvent
(由 Irit Katriel 在 gh-111997 中贡献)。
添加
PyMutex
,一个占用单个字节的轻量级互斥锁,以及新的PyMutex_Lock()
和PyMutex_Unlock()
函数。PyMutex_Lock()
如果操作需要阻塞,将释放 GIL(如果当前持有)。(由 Sam Gross 在 gh-108724 中贡献。)添加 PyTime C API 以提供对系统时钟的访问
(由 Victor Stinner 和 Petr Viktorin 在 gh-110850 中贡献。)
添加
PyDict_ContainsString()
函数,其行为与PyDict_Contains()
相同,但 key 被指定为 const char* UTF-8 编码的字节字符串,而不是 PyObject*。(由 Victor Stinner 在 gh-108314 中贡献。)添加
PyDict_GetItemRef()
和PyDict_GetItemStringRef()
函数,它们的行为类似于PyDict_GetItemWithError()
,但返回 强引用 而不是 借用引用。此外,这些函数在出错时返回-1
,从而无需检查PyErr_Occurred()
。(由 Victor Stinner 在 gh-106004 中贡献。)添加
PyDict_SetDefaultRef()
函数,其行为类似于PyDict_SetDefault()
,但返回 强引用 而不是 借用引用。此函数在出错时返回-1
,在插入时返回0
,如果字典中已存在该键则返回1
。(由 Sam Gross 在 gh-112066 中贡献。)添加
PyDict_Pop()
和PyDict_PopString()
函数,用于从字典中移除一个键并可选地返回被移除的值。这类似于 Python 的dict.pop()
,但没有默认值,并且不会因缺少键而引发KeyError
。(由 Stefan Behnel 和 Victor Stinner 在 gh-111262 中贡献。)添加
PyMapping_GetOptionalItem()
和PyMapping_GetOptionalItemString()
函数,作为PyObject_GetItem()
和PyMapping_GetItemString()
的替代品。新函数在映射中缺少请求的键时不会引发KeyError
。如果缺少键不应被视为失败,这些变体更方便快捷。(由 Serhiy Storchaka 在 gh-106307 中贡献。)添加
PyObject_GetOptionalAttr()
和PyObject_GetOptionalAttrString()
函数,作为PyObject_GetAttr()
和PyObject_GetAttrString()
的替代品。新函数在对象上未找到请求的属性时不会引发AttributeError
。如果缺少属性不应被视为失败,这些变体更方便快捷。(由 Serhiy Storchaka 在 gh-106521 中贡献。)添加
PyErr_FormatUnraisable()
函数,作为PyErr_WriteUnraisable()
的扩展,允许自定义警告消息。(由 Serhiy Storchaka 在 gh-108082 中贡献。)作为 PEP 667 的一部分,添加了返回帧局部变量、全局变量和内置函数的 强引用 而不是 借用引用 的新函数
(由 Mark Shannon 和 Tian Gao 在 gh-74929 中贡献。)
添加
Py_GetConstant()
和Py_GetConstantBorrowed()
函数以获取常量的 强引用 或 借用引用。例如,Py_GetConstant(Py_CONSTANT_ZERO)
返回常量零的强引用。(由 Victor Stinner 在 gh-115754 中贡献。)添加
PyImport_AddModuleRef()
函数作为PyImport_AddModule()
的替代品,它返回 强引用 而不是 借用引用。(由 Victor Stinner 在 gh-105922 中贡献。)添加
Py_IsFinalizing()
函数以检查主 Python 解释器是否正在 关闭。(由 Victor Stinner 在 gh-108014 中贡献。)添加
PyList_GetItemRef()
函数作为PyList_GetItem()
的替代品,它返回 强引用 而不是 借用引用。(由 Sam Gross 在 gh-114329 中贡献。)添加
PyList_Extend()
和PyList_Clear()
函数,它们镜像了 Python 的list.extend()
和list.clear()
方法。(由 Victor Stinner 在 gh-111138 中贡献。)添加
PyLong_AsInt()
函数。其行为类似于PyLong_AsLong()
,但将结果存储在 C int 中,而不是 C long 中。(由 Victor Stinner 在 gh-108014 中贡献。)添加
PyLong_AsNativeBytes()
、PyLong_FromNativeBytes()
和PyLong_FromUnsignedNativeBytes()
函数,以简化本机整数类型和 Pythonint
对象之间的转换。(由 Steve Dower 在 gh-111140 中贡献。)添加
PyModule_Add()
函数,它类似于PyModule_AddObjectRef()
和PyModule_AddObject()
,但始终窃取对值的引用。(由 Serhiy Storchaka 在 gh-86493 中贡献。)添加
PyObject_GenericHash()
函数,该函数实现 Python 对象的默认哈希函数。(由 Serhiy Storchaka 在 gh-113024 中贡献。)添加
Py_HashPointer()
函数以哈希原始指针。(由 Victor Stinner 在 gh-111545 中贡献。)添加
PyObject_VisitManagedDict()
和PyObject_ClearManagedDict()
函数,这些函数必须由使用Py_TPFLAGS_MANAGED_DICT
标志的类型的遍历和清除函数调用。pythoncapi-compat 项目 可用于在 Python 3.11 和 3.12 中使用这些函数。(由 Victor Stinner 在 gh-107073 中贡献。)添加
PyRefTracer_SetTracer()
和PyRefTracer_GetTracer()
函数,它们可以像tracemalloc
模块一样跟踪对象的创建和销毁。(由 Pablo Galindo 在 gh-93502 中贡献。)添加
PySys_AuditTuple()
函数作为PySys_Audit()
的替代品,它将事件参数作为 Pythontuple
对象。(由 Victor Stinner 在 gh-85283 中贡献。)添加
PyThreadState_GetUnchecked()
函数作为PyThreadState_Get()
的替代品,如果结果为NULL
,它不会以致命错误杀死进程。调用者负责检查结果是否为NULL
。(由 Victor Stinner 在 gh-108867 中贡献。)添加
PyType_GetFullyQualifiedName()
函数以获取类型的完全限定名。如果type.__module__
是字符串且不等于'builtins'
或'__main__'
,则会添加模块名。(由 Victor Stinner 在 gh-111696 中贡献。)添加
PyType_GetModuleName()
函数以获取类型的模块名。这等同于获取type.__module__
属性。(由 Eric Snow 和 Victor Stinner 在 gh-111696 中贡献。)添加
PyUnicode_EqualToUTF8AndSize()
和PyUnicode_EqualToUTF8()
函数,用于将 Unicode 对象与 const char* UTF-8 编码字符串进行比较,如果它们相等则返回1
,否则返回0
。这些函数不引发异常。(由 Serhiy Storchaka 在 gh-110289 中贡献。)添加
PyWeakref_GetRef()
函数作为PyWeakref_GetObject()
的替代品,它返回 强引用,如果被引用对象不再存在则返回NULL
。(由 Victor Stinner 在 gh-105927 中贡献。)添加静默忽略错误的函数的修正版本
PyObject_HasAttrStringWithError()
替换PyObject_HasAttrString()
。PyMapping_HasKeyStringWithError()
替换了PyMapping_HasKeyString()
。
新的函数在发生错误时返回
-1
,在结果为真时返回标准的1
,在结果为假时返回0
。(由 Serhiy Storchaka 在 gh-108511 中贡献。)
已更改的 C API¶
PyArg_ParseTupleAndKeywords()
和PyArg_VaParseTupleAndKeywords()
的 keywords 参数现在在 C 中类型为 char *const*,在 C++ 中类型为 const char *const*,而不是 char**。在 C++ 中,这使得这些函数与类型为 const char *const*、const char** 或 char *const* 的参数兼容,无需显式类型转换。在 C 中,这些函数仅支持类型为 char *const* 的参数。这可以通过PY_CXX_CONST
宏覆盖。(由 Serhiy Storchaka 在 gh-65210 中贡献。)PyArg_ParseTupleAndKeywords()
现在支持非 ASCII 关键字参数名称。(由 Serhiy Storchaka 在 gh-110815 中贡献。)PyCode_GetFirstFree()
函数现在是不稳定 API,并被命名为PyUnstable_Code_GetFirstFree()
。(由 Bogdan Romanyuk 在 gh-115781 中贡献。)函数
PyDict_GetItem()
、PyDict_GetItemString()
、PyMapping_HasKey()
、PyMapping_HasKeyString()
、PyObject_HasAttr()
、PyObject_HasAttrString()
和PySys_GetObject()
在调用时会清除所有发生的错误,现在它们使用sys.unraisablehook()
报告这些错误。您可以根据文档中的建议将其替换为其他函数。(由 Serhiy Storchaka 在 gh-106672 中贡献。)为
PyUnicode_FromFormat()
添加了对%T
、%#T
、%N
和%#N
格式的支持%T
: 获取对象类型的完整限定名%#T
: 同上,但使用冒号作为分隔符%N
: 获取类型的完整限定名%#N
: 同上,但使用冒号作为分隔符
在使用 格式代码 中的
#
格式时,您不再需要在包含Python.h
之前定义PY_SSIZE_T_CLEAN
宏。接受格式代码的 API 始终对#
格式使用Py_ssize_t
。(由 Inada Naoki 在 gh-104922 中贡献。)如果 Python 以 调试模式 构建或
with assertions
构建,PyTuple_SET_ITEM()
和PyList_SET_ITEM()
现在会使用断言检查索引参数。(由 Victor Stinner 在 gh-106168 中贡献。)
受限 C API 更改¶
以下函数现在已包含在受限 C API 中
使用
--with-trace-refs
(追踪引用) 构建的 Python 现在支持 受限 API。(由 Victor Stinner 在 gh-108634 中贡献。)
已移除的 C API¶
移除了一些以
_Py
或_PY
为前缀的函数、宏、变量等 (被认为是私有的)。如果您的项目受到其中某个移除的影响,并且您认为移除的 API 应该仍然可用,请 提出新问题 以请求公开 C API,并在问题中添加cc: @vstinner
以通知 Victor Stinner。(由 Victor Stinner 在 gh-106320 中贡献。)删除了 Python 3.0 中已弃用的旧缓冲区协议。请改用 缓冲区协议。
PyObject_CheckReadBuffer()
:使用PyObject_CheckBuffer()
来测试对象是否支持缓冲区协议。请注意,PyObject_CheckBuffer()
不保证PyObject_GetBuffer()
会成功。要测试对象是否实际可读,请参见PyObject_GetBuffer()
的下一个示例。PyObject_AsCharBuffer()
,PyObject_AsReadBuffer()
: 请改用PyObject_GetBuffer()
和PyBuffer_Release()
Py_buffer view; if (PyObject_GetBuffer(obj, &view, PyBUF_SIMPLE) < 0) { return NULL; } // Use `view.buf` and `view.len` to read from the buffer. // You may need to cast buf as `(const char*)view.buf`. PyBuffer_Release(&view);
PyObject_AsWriteBuffer()
: 请改用PyObject_GetBuffer()
和PyBuffer_Release()
Py_buffer view; if (PyObject_GetBuffer(obj, &view, PyBUF_WRITABLE) < 0) { return NULL; } // Use `view.buf` and `view.len` to write to the buffer. PyBuffer_Release(&view);
(由 Inada Naoki 在 gh-85275 中贡献。)
移除 Python 3.9 中已弃用的各种函数
PyEval_CallObject()
、PyEval_CallObjectWithKeywords()
:请改用PyObject_CallNoArgs()
或PyObject_Call()
。警告
在
PyObject_Call()
中,位置参数必须是tuple
且不能为NULL
,而关键字参数必须是dict
或NULL
。被移除的函数会检查参数类型,并接受NULL
位置和关键字参数。要将PyEval_CallObjectWithKeywords(func, NULL, kwargs)
替换为PyObject_Call()
,请使用PyTuple_New(0)
传递空元组作为位置参数。PyEval_CallFunction()
: 请改用PyObject_CallFunction()
。PyEval_CallMethod()
: 请改用PyObject_CallMethod()
。PyCFunction_Call()
: 请改用PyObject_Call()
。
(由 Victor Stinner 在 gh-105107 中贡献。)
移除 Python 3.11 中已弃用的以下用于配置 Python 初始化的旧函数
PySys_AddWarnOptionUnicode()
:请改用PyConfig.warnoptions
。PySys_AddWarnOption()
:请改用PyConfig.warnoptions
。PySys_AddXOption()
:请改用PyConfig.xoptions
。PySys_HasWarnOptions()
:请改用PyConfig.xoptions
。PySys_SetPath()
:请改设PyConfig.module_search_paths
。Py_SetPath()
:请改设PyConfig.module_search_paths
。Py_SetStandardStreamEncoding()
:请改设PyConfig.stdio_encoding
,并可能设置PyConfig.legacy_windows_stdio
(在 Windows 上)。_Py_SetProgramFullPath()
:请改设PyConfig.executable
。
请改用 Python 3.8 中新增的
PyConfig
API 的 Python 初始化配置 (PEP 587)。(由 Victor Stinner 在 gh-105145 中贡献。)移除 Python 3.2 中已弃用的
PyEval_AcquireLock()
和PyEval_ReleaseLock()
函数。它们没有更新当前线程状态。它们可以被替换为(由 Victor Stinner 在 gh-105182 中贡献。)
移除 Python 3.9 中已弃用的
PyEval_ThreadsInitialized()
函数。自 Python 3.7 以来,Py_Initialize()
始终创建 GIL:调用PyEval_InitThreads()
不执行任何操作,PyEval_ThreadsInitialized()
始终返回非零值。(由 Victor Stinner 在 gh-105182 中贡献。)移除了
_PyInterpreterState_Get()
,它是PyInterpreterState_Get()
的别名,用于向后兼容 Python 3.8。pythoncapi-compat 项目 可用于在 Python 3.8 及更早版本中获取PyInterpreterState_Get()
。(由 Victor Stinner 在 gh-106320 中贡献。)移除了私有函数
_PyObject_FastCall()
:请改用自 Python 3.8 (PEP 590) 起可用的PyObject_Vectorcall()
。(由 Victor Stinner 在 gh-106023 中贡献。)移除
cpython/pytime.h
头文件,该文件只包含私有函数。(由 Victor Stinner 在 gh-106316 中贡献。)从受限 C API 中移除了未文档化的
PY_TIMEOUT_MAX
常量。(由 Victor Stinner 在 gh-110014 中贡献。)移除了旧的垃圾回收宏
Py_TRASHCAN_SAFE_BEGIN
和Py_TRASHCAN_SAFE_END
。请改用新的宏Py_TRASHCAN_BEGIN
和Py_TRASHCAN_END
。(由 Irit Katriel 在 gh-105111 中贡献。)
已弃用的 C API¶
弃用旧的 Python 初始化函数
PySys_ResetWarnOptions()
:请改用清空sys.warnoptions
和warnings.filters
。Py_GetPath()
:请改用sys.path
。Py_GetPrefix()
:请改用sys.prefix
。Py_GetPythonHome()
:请改用PyConfig.home
或PYTHONHOME
环境变量。
(由 Victor Stinner 在 gh-105145 中贡献。)
软弃用
PyEval_GetBuiltins()
、PyEval_GetGlobals()
和PyEval_GetLocals()
函数,它们返回 借用引用。(作为 PEP 667 的一部分软弃用。)弃用
PyImport_ImportModuleNoBlock()
函数,该函数自 Python 3.3 起只是PyImport_ImportModule()
的别名。(由 Victor Stinner 在 gh-105396 中贡献。)软弃用
PyModule_AddObject()
函数。应将其替换为PyModule_Add()
或PyModule_AddObjectRef()
。(由 Serhiy Storchaka 在 gh-86493 中贡献。)弃用旧的
Py_UNICODE
和PY_UNICODE_TYPE
类型以及Py_UNICODE_WIDE
定义。请直接使用wchar_t
类型。自 Python 3.3 以来,Py_UNICODE
和PY_UNICODE_TYPE
只是wchar_t
的别名。(由 Victor Stinner 在 gh-105156 中贡献。)弃用
PyWeakref_GetObject()
和PyWeakref_GET_OBJECT()
函数,它们返回 借用引用。请将其替换为新的PyWeakref_GetRef()
函数,该函数返回 强引用。pythoncapi-compat 项目 可用于在 Python 3.12 及更早版本上获取PyWeakref_GetRef()
。(由 Victor Stinner 在 gh-105927 中贡献。)
Python 3.14 中即将移除¶
扩展模块的
PyDictObject
中的ma_version_tag
字段 (PEP 699;gh-101193)。使用可变基类创建
immutable types
(gh-95388)。
Python 3.15 中即将移除¶
PyWeakref_GetObject()
和PyWeakref_GET_OBJECT()
:请改用PyWeakref_GetRef()
。可以使用 pythoncapi-compat 项目 在 Python 3.12 及更早版本中获取PyWeakref_GetRef()
。Py_UNICODE
类型和Py_UNICODE_WIDE
宏:请改用wchar_t
。PyUnicode_AsDecodedObject()
:请改用PyCodec_Decode()
。PyUnicode_AsDecodedUnicode()
:请改用PyCodec_Decode()
;请注意,某些编解码器(例如“base64”)可能返回str
以外的类型,例如bytes
。PyUnicode_AsEncodedObject()
:请改用PyCodec_Encode()
。PyUnicode_AsEncodedUnicode()
:请改用PyCodec_Encode()
;请注意,某些编解码器(例如“base64”)可能返回bytes
以外的类型,例如str
。Python 初始化函数,在 Python 3.13 中被弃用
Py_GetPath()
:请改用PyConfig_Get("module_search_paths")
(sys.path
)。Py_GetPrefix()
:请改用PyConfig_Get("base_prefix")
(sys.base_prefix
)。如果需要处理 虚拟环境,请使用PyConfig_Get("prefix")
(sys.prefix
)。Py_GetExecPrefix()
:请改用PyConfig_Get("base_exec_prefix")
(sys.base_exec_prefix
)。如果需要处理 虚拟环境,请使用PyConfig_Get("exec_prefix")
(sys.exec_prefix
)。Py_GetProgramFullPath()
:请改用PyConfig_Get("executable")
(sys.executable
)。Py_GetProgramName()
:请改用PyConfig_Get("executable")
(sys.executable
)。Py_GetPythonHome()
:请改用PyConfig_Get("home")
或PYTHONHOME
环境变量。
可以使用 pythoncapi-compat 项目 在 Python 3.13 及更早版本中获得
PyConfig_Get()
。用于配置 Python 初始化的函数,在 Python 3.11 中被弃用
PySys_SetArgvEx()
:请改用设置PyConfig.argv
。PySys_SetArgv()
:请改用设置PyConfig.argv
。Py_SetProgramName()
:请改用设置PyConfig.program_name
。Py_SetPythonHome()
:请改用设置PyConfig.home
。PySys_ResetWarnOptions()
:请改用清空sys.warnoptions
和warnings.filters
。
应使用
Py_InitializeFromConfig()
API 与PyConfig
配合使用。全局配置变量
Py_DebugFlag
:请改用PyConfig.parser_debug
或PyConfig_Get("parser_debug")
。Py_VerboseFlag
:请改用PyConfig.verbose
或PyConfig_Get("verbose")
。Py_InteractiveFlag
:请改用PyConfig.interactive
或PyConfig_Get("interactive")
。Py_InspectFlag
:请改用PyConfig.inspect
或PyConfig_Get("inspect")
。Py_OptimizeFlag
:请改用PyConfig.optimization_level
或PyConfig_Get("optimization_level")
。Py_NoSiteFlag
:请改用PyConfig.site_import
或PyConfig_Get("site_import")
。Py_BytesWarningFlag
:请改用PyConfig.bytes_warning
或PyConfig_Get("bytes_warning")
。Py_FrozenFlag
:请改用PyConfig.pathconfig_warnings
或PyConfig_Get("pathconfig_warnings")
。Py_IgnoreEnvironmentFlag
:请改用PyConfig.use_environment
或PyConfig_Get("use_environment")
。Py_DontWriteBytecodeFlag
:请改用PyConfig.write_bytecode
或PyConfig_Get("write_bytecode")
。Py_NoUserSiteDirectory
:请改用PyConfig.user_site_directory
或PyConfig_Get("user_site_directory")
。Py_UnbufferedStdioFlag
:请改用PyConfig.buffered_stdio
或PyConfig_Get("buffered_stdio")
。Py_HashRandomizationFlag
:请改用PyConfig.use_hash_seed
和PyConfig.hash_seed
或PyConfig_Get("hash_seed")
。Py_IsolatedFlag
:请改用PyConfig.isolated
或PyConfig_Get("isolated")
。Py_LegacyWindowsFSEncodingFlag
:请改用PyPreConfig.legacy_windows_fs_encoding
或PyConfig_Get("legacy_windows_fs_encoding")
。Py_LegacyWindowsStdioFlag
:请改用PyConfig.legacy_windows_stdio
或PyConfig_Get("legacy_windows_stdio")
。Py_FileSystemDefaultEncoding
、Py_HasFileSystemDefaultEncoding
:请改用PyConfig.filesystem_encoding
或PyConfig_Get("filesystem_encoding")
。Py_FileSystemDefaultEncodeErrors
:请改用PyConfig.filesystem_errors
或PyConfig_Get("filesystem_errors")
。Py_UTF8Mode
:请改用PyPreConfig.utf8_mode
或PyConfig_Get("utf8_mode")
。(请参阅Py_PreInitialize()
)
应使用
Py_InitializeFromConfig()
API 与PyConfig
一起设置这些选项。或者,可以使用PyConfig_Get()
在运行时获取这些选项。
Python 3.16 中即将移除¶
捆绑的
libmpdec
副本。
计划在 Python 3.18 中移除¶
以下私有函数已被弃用,并计划在 Python 3.18 中移除
_PyBytes_Join()
:请使用PyBytes_Join()
。_PyDict_GetItemStringWithError()
:请使用PyDict_GetItemStringRef()
。_PyDict_Pop()
:请使用PyDict_Pop()
。_PyLong_Sign()
:请使用PyLong_GetSign()
。_PyLong_FromDigits()
和_PyLong_New()
:请使用PyLongWriter_Create()
。_PyThreadState_UncheckedGet()
:请使用PyThreadState_GetUnchecked()
。_PyUnicode_AsString()
:请使用PyUnicode_AsUTF8()
。_PyUnicodeWriter_Init()
:请将_PyUnicodeWriter_Init(&writer)
替换为writer = PyUnicodeWriter_Create(0)
。_PyUnicodeWriter_Finish()
:请将_PyUnicodeWriter_Finish(&writer)
替换为PyUnicodeWriter_Finish(writer)
。_PyUnicodeWriter_Dealloc()
:请将_PyUnicodeWriter_Dealloc(&writer)
替换为PyUnicodeWriter_Discard(writer)
。_PyUnicodeWriter_WriteChar()
:请将_PyUnicodeWriter_WriteChar(&writer, ch)
替换为PyUnicodeWriter_WriteChar(writer, ch)
。_PyUnicodeWriter_WriteStr()
:请将_PyUnicodeWriter_WriteStr(&writer, str)
替换为PyUnicodeWriter_WriteStr(writer, str)
。_PyUnicodeWriter_WriteSubstring()
:请将_PyUnicodeWriter_WriteSubstring(&writer, str, start, end)
替换为PyUnicodeWriter_WriteSubstring(writer, str, start, end)
。_PyUnicodeWriter_WriteASCIIString()
:请将_PyUnicodeWriter_WriteASCIIString(&writer, str)
替换为PyUnicodeWriter_WriteASCII(writer, str)
。_PyUnicodeWriter_WriteLatin1String()
:请将_PyUnicodeWriter_WriteLatin1String(&writer, str)
替换为PyUnicodeWriter_WriteUTF8(writer, str)
。_PyUnicodeWriter_Prepare()
:(无替代品)。_PyUnicodeWriter_PrepareKind()
:(无替代品)。_Py_HashPointer()
:请使用Py_HashPointer()
。_Py_fopen_obj()
:请使用Py_fopen()
。
可以使用 pythoncapi-compat 项目 在 Python 3.13 及更早版本中获得这些新的公共函数。(由 Victor Stinner 在 gh-128863 中贡献。)
未来版本中即将移除¶
以下 API 已被弃用并将被移除,但目前尚未确定移除日期。
Py_TPFLAGS_HAVE_FINALIZE
:自 Python 3.8 起已不再需要。PySlice_GetIndicesEx()
:请改用PySlice_Unpack()
和PySlice_AdjustIndices()
。PyUnicode_READY()
:自 Python 3.12 起已不再需要PyErr_Display()
:请改用PyErr_DisplayException()
。_PyErr_ChainExceptions()
:请改用_PyErr_ChainExceptions1()
。PyBytesObject.ob_shash
成员:请改用调用PyObject_Hash()
。线程本地存储 (TLS) API
构建更改¶
arm64-apple-ios
和arm64-apple-ios-simulator
现在都是 PEP 11 第三层平台。(Russell Keith-Magee 贡献了 PEP 730 的编写和实现,参见 gh-114099。)aarch64-linux-android
和x86_64-linux-android
现在都是 PEP 11 第三层平台。(Malcolm Smith 贡献了 PEP 738 的编写和实现,参见 gh-116622。)wasm32-wasi
现在是 PEP 11 第二层平台。(由 Brett Cannon 在 gh-115192 中贡献。)wasm32-emscripten
不再是 PEP 11 支持的平台。(由 Brett Cannon 在 gh-115192 中贡献。)构建 CPython 现在需要一个支持 C11 原子库、GCC 内置原子函数或 MSVC 互锁内部函数的编译器。
现在需要 Autoconf 2.71 和 aclocal 1.16.5 才能重新生成
configure
脚本。(由 Christian Heimes 在 gh-89886 中贡献,并由 Victor Stinner 在 gh-112090 中贡献。)需要 SQLite 3.15.2 或更新版本才能构建
sqlite3
扩展模块。(由 Erlend Aasland 在 gh-105875 中贡献。)CPython 现在默认捆绑 mimalloc 库。它采用 MIT 许可证授权;详见 mimalloc 许可证。捆绑的 mimalloc 进行了自定义修改,详见 gh-113141。(由 Dino Viehland 在 gh-109914 中贡献。)
configure
选项--with-system-libmpdec
现在默认为yes
。捆绑的libmpdec
将在 Python 3.16 中移除。使用
configure
--with-trace-refs
(跟踪引用) 构建的 Python 现在与 Python 发布版构建和 调试构建 ABI 兼容。(由 Victor Stinner 在 gh-108634 中贡献。)在 POSIX 系统上,pkg-config (
.pc
) 文件名现在包含 ABI 标志。例如,自由线程构建生成python-3.13t.pc
,调试构建生成python-3.13d.pc
。errno
、fcntl
、grp
、md5
、pwd
、resource
、termios
、winsound
、_ctypes_test
、_multiprocessing.posixshmem
、_scproxy
、_stat
、_statistics
、_testconsole
、_testimportmultiple
和_uuid
C 扩展现在使用 受限 C API 构建。(由 Victor Stinner 在 gh-85283 中贡献。)
移植到 Python 3.13¶
本节列出了前面描述过的变更以及其他可能需要修改代码的 bug 修复。
Python API 的变化¶
PEP 667 引入了
locals()
和f_locals
语义的几项更改在 优化范围 中调用
locals()
现在每次调用都会生成一个独立的快照,因此不再隐式更新先前返回的引用。要获得传统的 CPython 行为,现在需要显式调用以使用后续locals()
调用的结果更新最初返回的字典。隐式以locals()
为目标的代码执行函数(例如exec
和eval
)必须传递一个显式命名空间才能在优化范围内访问其结果。(作为 PEP 667 的一部分进行了更改。)在模块或类作用域的推导式中调用
locals()
(包括通过exec
或eval
) 再次表现为推导式作为独立的嵌套函数运行 (即不包含包含作用域中的局部变量)。在 Python 3.12 中,当实现 PEP 709 时,这已经更改为包含包含作用域中的局部变量。(作为 PEP 667 的一部分进行了更改。)在 优化作用域 中访问
FrameType.f_locals
现在返回一个直写代理,而不是一个在未指定时间更新的快照。如果需要快照,必须使用dict
或代理的.copy()
方法显式创建。(作为 PEP 667 的一部分进行了更改。)
functools.partial
在用作方法时现在会发出FutureWarning
。其行为将在未来的 Python 版本中改变。如果您想保留旧的行为,请将其包装在staticmethod()
中。(由 Serhiy Storchaka 在 gh-121027 中贡献。)getpass.getuser()
现在会在检索用户名失败时引发OSError
>,而不是在非 Unix 平台上引发ImportError
>,或在密码数据库为空的 Unix 平台上引发KeyError
>。gzip.GzipFile
的mode
属性的值现在是字符串('rb'
或'wb'
),而不是整数(1
或2
)。zipfile.ZipFile.open()
返回的可读文件类对象的mode
属性的值现在是'rb'
,而不是'r'
。(由 Serhiy Storchaka 在 gh-115961 中贡献。)mailbox.Maildir
现在忽略以点 (.
) 开头的文件。(由 Zackery Spytz 在 gh-65559 中贡献。)pathlib.Path.glob()
和rglob()
现在,如果给定的模式以“**
”结尾,则会同时返回文件和目录,而不是仅返回目录。添加一个尾部斜杠以保持以前的行为并仅匹配目录。threading
模块现在要求_thread
模块具有一个_is_main_interpreter()
函数。此函数不接受任何参数,如果当前解释器是主解释器,则返回True
。任何提供自定义
_thread
模块的库或应用程序都必须提供_is_main_interpreter()
,就像该模块的其他“私有”属性一样。(gh-112826。)
C API 的变化¶
Python.h
不再包含<ieeefp.h>
标准头文件。它曾用于提供finite()
函数,该函数现在由<math.h>
头文件提供。如果需要,现在应显式包含它。同时移除了HAVE_IEEEFP_H
宏。(由 Victor Stinner 在 gh-108765 中贡献。)Python.h
不再包含以下标准头文件:<time.h>
、<sys/select.h>
和<sys/time.h>
。如果需要,现在应该显式包含它们。例如,<time.h>
提供clock()
和gmtime()
函数,<sys/select.h>
提供select()
函数,<sys/time.h>
提供futimes()
、gettimeofday()
和setitimer()
函数。(由 Victor Stinner 在 gh-108765 中贡献。)在 Windows 上,
Python.h
不再包含<stddef.h>
标准头文件。如果需要,现在应该显式包含它。例如,它提供了offsetof()
函数以及size_t
和ptrdiff_t
类型。显式包含<stddef.h>
已经被所有其他平台所需要,HAVE_STDDEF_H
宏只在 Windows 上定义。(由 Victor Stinner 在 gh-108765 中贡献。)如果定义了
Py_LIMITED_API
宏,则Py_BUILD_CORE
、Py_BUILD_CORE_BUILTIN
和Py_BUILD_CORE_MODULE
宏现在会被<Python.h>
取消定义。(由 Victor Stinner 在 gh-85283 中贡献。)旧的垃圾回收宏
Py_TRASHCAN_SAFE_BEGIN
和Py_TRASHCAN_SAFE_END
已被移除。它们应该被新的宏Py_TRASHCAN_BEGIN
和Py_TRASHCAN_END
替换。使用旧宏的
tp_dealloc
函数,例如static void mytype_dealloc(mytype *p) { PyObject_GC_UnTrack(p); Py_TRASHCAN_SAFE_BEGIN(p); ... Py_TRASHCAN_SAFE_END }
应按如下方式迁移到新宏
static void mytype_dealloc(mytype *p) { PyObject_GC_UnTrack(p); Py_TRASHCAN_BEGIN(p, mytype_dealloc) ... Py_TRASHCAN_END }
请注意,
Py_TRASHCAN_BEGIN
有第二个参数,该参数应该是它所在的释放函数。新宏在 Python 3.8 中添加,旧宏在 Python 3.11 中弃用。(由 Irit Katriel 在 gh-105111 中贡献。)
PEP 667 引入了与帧相关的函数的几项更改
在 优化作用域 中修改从
PyEval_GetLocals()
返回的字典的影响已更改。以这种方式添加的新字典条目现在将 仅 对该帧中后续的PyEval_GetLocals()
调用可见,因为PyFrame_GetLocals()
、locals()
和FrameType.f_locals
不再访问相同的底层缓存字典。对实际变量名和通过直写代理接口添加的名称的条目所做的更改将在该帧中后续调用PyEval_GetLocals()
时被覆盖。建议的代码更新取决于函数的使用方式,因此请参阅函数的弃用通知以获取详细信息。在 优化作用域 中调用
PyFrame_GetLocals()
现在返回一个直写代理,而不是一个在未指定时间更新的快照。如果需要快照,必须显式创建(例如使用PyDict_Copy()
),或者调用新的PyEval_GetFrameLocals()
API。PyFrame_FastToLocals()
和PyFrame_FastToLocalsWithError()
不再有任何效果。自 Python 3.11 引入PyFrame_GetLocals()
以来,调用这些函数就是多余的。PyFrame_LocalsToFast()
不再有任何效果。现在PyFrame_GetLocals()
为 优化作用域 返回一个直写代理,因此调用此函数是多余的。
Python 3.13 移除了许多私有函数。其中一些可以使用这些替代方案替换
_PyDict_Pop()
:PyDict_Pop()
或PyDict_PopString()
;_PyDict_GetItemWithError()
:PyDict_GetItemRef()
;_PyErr_WriteUnraisableMsg()
:PyErr_FormatUnraisable()
;_PyEval_SetTrace()
:PyEval_SetTrace()
或PyEval_SetTraceAllThreads()
;_PyList_Extend()
:PyList_Extend()
;_PyLong_AsInt()
:PyLong_AsInt()
;_PyMem_RawStrdup()
:strdup()
;_PyMem_Strdup()
:strdup()
;_PyObject_ClearManagedDict()
:PyObject_ClearManagedDict()
;_PyObject_VisitManagedDict()
:PyObject_VisitManagedDict()
;_PyThreadState_UncheckedGet()
:PyThreadState_GetUnchecked()
;_PyTime_AsSecondsDouble()
:PyTime_AsSecondsDouble()
;_PyTime_GetMonotonicClock()
:PyTime_Monotonic()
或PyTime_MonotonicRaw()
;_PyTime_GetPerfCounter()
:PyTime_PerfCounter()
或PyTime_PerfCounterRaw()
;_PyTime_GetSystemClock()
:PyTime_Time()
或PyTime_TimeRaw()
;_PyTime_MAX
:PyTime_MAX
;_PyTime_MIN
:PyTime_MIN
;_PyTime_t
:PyTime_t
;_Py_HashPointer()
:Py_HashPointer()
;_Py_IsFinalizing()
:Py_IsFinalizing()
。
pythoncapi-compat 项目 可用于在 Python 3.12 及更早版本中获取这些新函数中的大部分。
回归测试更改¶
使用
configure
--with-pydebug
构建的 Python 现在支持-X presite=package.module
命令行选项。如果使用,它指定一个模块,该模块应在解释器生命周期的早期,即在执行site.py
之前导入。(由 Łukasz Langa 在 gh-110769 中贡献。)