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
现在作为 2 级 平台受到支持。wasm32-emscripten
不再是官方支持的平台。
重要的移除
PEP 594:剩下的 19 个“僵尸电池”(旧版 stdlib 模块)已从标准库中移除:
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 的年度发布周期”)已更新,将新版本的完整支持(“错误修复”)周期延长至两年。此更新的政策意味着
Python 3.9–3.12 有一年半的完整支持,之后有三年半的安全修复。
Python 3.13 及更高版本有两年的完整支持,之后有三年的安全修复。
新特性¶
更好的交互式解释器¶
Python 现在默认使用一个新的交互式 shell,该 shell 基于 PyPy 项目中的代码。当用户从交互式终端启动 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
。标记为无线程的预构建二进制文件可以作为官方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,该公司为支持该项目提供了大量的工程资源。
一个实验性的即时 (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 解释器,但它主要用于调试优化管道的早期阶段。可以通过使用
--enable-experimental-jit=interpreter
配置 Python 来启用 Tier 2 解释器。启用 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
目标为第 3 级支持(分别对应 2013 年之后发布的 iPhone 和 iPad 设备,以及在 Apple 芯片硬件上运行的 Xcode iOS 模拟器)。x86_64-apple-ios-simulator
(在较旧的 x86_64
硬件上运行的 Xcode iOS 模拟器)不是第 3 级支持的平台,但会提供尽力而为的支持。(PEP 由 Russell Keith-Magee 撰写并贡献了实现,见 gh-114099。)
PEP 738:Android 现在是 PEP 11 支持的平台,其中 aarch64-linux-android
和 x86_64-linux-android
目标为第 3 级支持。32 位目标 arm-linux-androideabi
和 i686-linux-android
不是第 3 级支持的平台,但会提供尽力而为的支持。(PEP 由 Malcolm Smith 撰写并贡献了实现,见 gh-116622。)
其他语言更改¶
编译器现在会删除文档字符串中每行开头多余的空格。这减小了 字节码缓存(例如
.pyc
文件)的大小,文件大小减少约 5%,例如 SQLAlchemy 2.0 中的sqlalchemy.orm.session
。此更改会影响使用文档字符串的工具,例如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 中贡献。)现在允许在
except
块中使用global
声明,前提是该全局变量在else
块中使用。以前,这会引发错误的SyntaxError
。(由 Irit Katriel 在 gh-111123 中贡献。)添加
PYTHON_FROZEN_MODULES
,一个新的环境变量,用于确定导入机制是否忽略冻结模块,等效于-X frozen_modules
命令行选项。(由 Yilei Yang 在 gh-111374 中贡献。)添加通过新的环境变量
PYTHON_PERF_JIT_SUPPORT
和命令行选项-X perf_jit
,支持 perf 分析器在没有帧指针的情况下工作。(由 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 中贡献。)
数组¶
为 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()
方法。这确保在下一个await
时会引发CancelledError
,因此取消不会丢失。这些更改的一个额外好处是,任务组现在保留取消计数 (
cancelling()
)。为了处理一些极端情况,当取消计数达到零时,
uncancel()
现在可能会重置未记录的_must_cancel
标志。(受 Arthur Tacca 在 gh-116720 中报告的问题的启发。)
当在非活动的
TaskGroup
上调用TaskGroup.create_task()
时,将关闭给定的协程(这可以防止出现关于从未等待给定协程的RuntimeWarning
)。(由 Arthur Tacca 和 Jason Zhang 在 gh-115957 中贡献。)
base64¶
添加
z85encode()
和z85decode()
函数,用于将bytes
编码为 Z85 数据,以及将 Z85 编码的数据解码为bytes
。(由 Matan Perelman 在 gh-75299 中贡献。)
compileall¶
现在使用
os.process_cpu_count()
而不是os.cpu_count()
来选择默认的工作线程和进程数。(由 Victor Stinner 在 gh-109649 中贡献。)
concurrent.futures¶
现在使用
os.process_cpu_count()
而不是os.cpu_count()
来选择默认的工作线程和进程数。(由 Victor Stinner 在 gh-109649 中贡献。)
configparser¶
ConfigParser
现在支持未命名部分,允许顶层键值对。可以使用新的 *allow_unnamed_section* 参数启用此功能。(由 Pedro Sousa Lacerda 在 gh-66449 中贡献。)
copy¶
新的
replace()
函数和replace 协议
使创建对象的修改副本变得更加简单。这在使用不可变对象时尤其有用。以下类型支持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.clear()
和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 中贡献。)修复
is_global
和is_private
在IPv4Address
,IPv6Address
,IPv4Network
, 和IPv6Network
中的行为。(由 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()
来选择默认的工作线程和进程数。(由 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_CLOSEFROM
属性,该属性位于支持posix_spawn_file_actions_addclosefrom_np()
的平台上的 file_actions 参数中。(由 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
对象没有被显式关闭
,则现在会发出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
可能会拒绝 pre-RFC 5280 或格式错误的证书,而底层 OpenSSL 实现可能会接受这些证书。虽然不建议禁用此功能,但您可以使用以下方式禁用它: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()
创建的估计概率密度函数中采样的kde_random()
。(由 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()
函数来测试字符串是否已被驻留。此函数不保证在 Python 的所有实现中都存在。(由 Serhiy Storchaka 在 gh-78573 中贡献。)
tempfile¶
在 Windows 上,由于
os.mkdir()
的更改,tempfile.mkdtemp()
使用的默认模式0o700
现在限制对新目录的访问。这是对 CVE 2024-4030 的缓解措施。(由 Steve Dower 在 gh-118486 中贡献。)
time¶
在 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 中贡献。)在
element_create()
方法的tkinter.ttk.Style
中支持 “vsapi” 元素类型。(由 Serhiy Storchaka 在 gh-68166 中贡献。)为 Tkinter 小部件添加
after_info()
方法。(由 Cheryl Sabella 在 gh-77020 中贡献。)向
PhotoImage
添加一个新的copy_replace()
方法,用于将一个图像的区域复制到另一个图像,可能会进行像素缩放、子采样或两者兼有。(由 Serhiy Storchaka 在 gh-118225 中贡献。)将 from_coords 参数添加到
PhotoImage
方法copy()
、zoom()
和subsample()
。将 zoom 和 subsample 参数添加到PhotoImage
方法copy()
。(由 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 中贡献。)
类型¶
SimpleNamespace
现在可以接受单个位置参数来初始化命名空间的参数。此参数必须是映射或键值对的可迭代对象。(由 Serhiy Storchaka 在 gh-108191 中贡献。)
类型提示¶
PEP 705:添加
ReadOnly
,一个特殊的类型提示结构,用于将TypedDict
项目标记为类型检查器的只读。添加
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
audioop
chunk
cgi
和cgitb
通常情况下,对于
GET
和HEAD
请求,可以使用urllib.parse.parse_qsl()
替换cgi.FieldStorage
;对于POST
和PUT
请求,可以使用email.message
模块或 multipart 库。除非输入是
multipart/form-data
,否则可以使用urllib.parse.parse_qs()
直接处理所需的查询字符串,来替换cgi.parse()
。对于multipart/form-data
,应按照下文关于cgi.parse_multipart()
的说明进行替换。可以使用
email
包中的功能替换cgi.parse_header()
,该包实现了相同的 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
可以使用
email
包中的功能替换cgi.parse_multipart()
,该包实现了相同的 MIME RFC,或者使用 multipart 库。例如,可以使用email.message.EmailMessage
和email.message.Message
类。
crypt
和私有的_crypt
扩展。如果只需要对值进行哈希处理,可以使用hashlib
模块作为合适的替代。否则,可以使用 PyPI 上的各种第三方库。bcrypt:为您的软件和服务器提供现代密码哈希。
passlib:全面的密码哈希框架,支持超过 30 种方案。
argon2-cffi:安全的 Argon2 密码哈希算法。
legacycrypt:
ctypes
对 POSIX crypt 库调用及相关功能的包装器。crypt_r:
crypt
模块的分支,是对 crypt_r(3) 库调用及相关功能的包装器。
imghdr
:应使用 filetype、puremagic 或 python-magic 库作为替代。例如,可以使用puremagic.what()
函数替换imghdr.what()
函数,以支持imghdr
支持的所有文件格式。mailcap
:请改用mimetypes
模块。msilib
nis
nntplib
:请改用 PyPI 上的 pynntp 库。ossaudiodev
:对于音频播放,请改用 PyPI 上的 pygame 库。pipes
:请改用subprocess
模块。 使用shlex.quote()
替换未记录的pipes.quote
函数。sndhdr
:应使用 filetype、puremagic 或 python-magic 库作为替代。spwd
:请改用 PyPI 上的 python-pam 库。sunau
telnetlib
:请改用 PyPI 上的 telnetlib3 或 Exscript 库。uu
:请改用base64
模块作为现代替代方案。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¶
删除 Python 3.11 中弃用的
locale.resetlocale()
函数。请改用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¶
移除在 Python 3.6 中已弃用的
tkinter.tix
模块。该模块包装的第三方 Tix 库未维护。(由 Zachary Ware 在 gh-75552 中贡献。)
turtle¶
移除
RawTurtle.settiltangle()
方法,该方法自 Python 3.1 以来在文档中已弃用,自 Python 3.11 以来在运行时已弃用。(由 Hugo van Kemenade 在 gh-104876 中贡献。)
typing¶
unittest¶
移除以下在 Python 3.11 中已弃用的
unittest
函数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
:-
弃用
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 参数,并弃用将None
传递给这两种类型的 fields 参数。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
:弃用
getmark()
、setmark()
和getmarkers()
Wave_read
和Wave_write
类的方法,将在 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 中贡献。)-
子进程监视器类
MultiLoopChildWatcher
,FastChildWatcher
,AbstractChildWatcher
和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 中贡献。)
collections.abc
: 已弃用ByteString
。请优先使用Sequence
或Buffer
。在类型标注中,请优先使用联合类型,例如bytes | bytearray
,或者collections.abc.Buffer
。(由 Shantanu Jain 在 gh-91896 中贡献。)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 操作的支持没有文档记录,效率低下,历史上存在错误且不一致。为了大幅减少代码量和维护负担,这将在 3.14 中移除。(由 Raymond Hettinger 在 gh-101588 中贡献。)multiprocessing
: 在 Linux、BSDs 和其他非 macOS POSIX 平台上,默认启动方法将更改为更安全的方法,当前在这些平台上默认使用'fork'
(gh-84559)。添加有关此更改的运行时警告被认为过于干扰,因为大多数代码预计不会关心这一点。当您的代码 *需要*'fork'
时,请使用get_context()
或set_start_method()
API 来显式指定。请参阅 上下文和启动方法。pathlib
:is_relative_to()
和relative_to()
: 传递额外的参数已被弃用。pkgutil
:find_loader()
和get_loader()
现在会引发DeprecationWarning
;请改用importlib.util.find_spec()
。(由 Nikita Sobolev 在 gh-97850 中贡献。)pty
:master_open()
: 请使用pty.openpty()
。slave_open()
: 请使用pty.openpty()
。
-
如果使用 命名占位符,并且 *parameters* 是序列而不是
dict
,则execute()
和executemany()
已被弃用。
typing
:ByteString
自 Python 3.9 以来已被弃用,现在使用时会发出DeprecationWarning
。urllib
:urllib.parse.Quoter
已被弃用:它不打算作为公共 API。(由 Gregory P. Smith 在 gh-88168 中贡献。)
Python 3.15 中待移除的功能¶
导入系统
在未能设置
__spec__.cached
的情况下,在模块上设置__cached__
已被弃用。在 Python 3.15 中,导入系统或标准库将不再设置或考虑__cached__
。( gh-97879)在未能设置
__spec__.parent
的情况下,在模块上设置__package__
已被弃用。在 Python 3.15 中,导入系统或标准库将不再设置或考虑__package__
。( gh-97879)
-
未文档化的
ctypes.SetPointerType()
函数自 Python 3.13 起已被弃用。
-
过时且很少使用的
CGIHTTPRequestHandler
自 Python 3.13 起已被弃用。没有直接的替代品。与 CGI 相比,*任何东西* 都更适合将 Web 服务器与请求处理程序连接起来。自 Python 3.13 起,python -m http.server 命令行接口的
--cgi
标志已被弃用。
-
自 Python 3.11 起,
getdefaultlocale()
函数已被弃用。其移除原计划在 Python 3.13 中进行 (gh-90817),但已推迟到 Python 3.15。请改用getlocale()
、setlocale()
和getencoding()
。(由 Hugo van Kemenade 在 gh-111187 中贡献。)
-
自 Python 3.13 起,
PurePath.is_reserved()
已被弃用。请使用os.path.isreserved()
来检测 Windows 上的保留路径。
-
自 Python 3.13 起,
java_ver()
已被弃用。此函数仅对 Jython 支持有用,API 令人困惑,并且在很大程度上未经测试。
线程
:在 Python 3.15 中,
RLock()
将不接受任何参数。自 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 起已被弃用。请改用基于类的语法或函数式语法。自 Python 3.13 起,
typing.no_type_check_decorator()
装饰器函数已被弃用。在typing
模块中存在八年后,它尚未得到任何主要类型检查器的支持。
wave
:getmark()
、setmark()
和getmarkers()
方法,分别属于Wave_read
和Wave_write
类,自 Python 3.13 起已被弃用。
计划在 Python 3.16 中移除¶
导入系统
在未能设置
__spec__.loader
的同时设置模块的__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 中贡献。)
-
自 Python 3.12 起,布尔类型的按位取反,
~True
或~False
已被弃用,因为它会产生令人惊讶且不直观的结果(-2
和-1
)。请改用not x
来进行布尔值的逻辑否定。在极少数情况下,如果您需要底层整数的按位取反,请显式转换为int
(~int(x)
)。
-
自 Python 3.14 起,
ExecError
异常已被弃用。自 Python 3.4 以来,shutil
中的任何函数都未使用过它,现在它是RuntimeError
的别名。
符号表
:自 Python 3.14 起,
Class.get_methods
方法已被弃用。
sys
:自 Python 3.13 起,
_enablelegacywindowsfsencoding()
函数已被弃用。请改用PYTHONLEGACYWINDOWSFSENCODING
环境变量。
-
自 Python 3.13 起,未记录且未使用的
TarFile.tarfile
属性已被弃用。
计划在未来版本中移除¶
以下 API 将在未来移除,尽管目前尚未安排移除的日期。
argparse
:嵌套参数组和嵌套互斥组已被弃用。-
bool(NotImplemented)
.生成器:
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)对返回非 int 类型的
__index__()
和__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 中贡献。)codeobject.co_lnotab
:请使用codeobject.co_lines()
方法代替。-
utcnow()
:请使用datetime.datetime.now(tz=datetime.UTC)
代替。utcfromtimestamp()
:请使用datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)
代替。
gettext
:复数形式的值必须为整数。-
load_module()
方法:请使用exec_module()
代替。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
sysconfig.is_python_build()
的 check_home 参数已被弃用且被忽略。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()
代替。
unittest.IsolatedAsyncioTestCase
:从测试用例中返回不是None
的值已被弃用。urllib.parse
中已弃用的函数:请使用urlparse()
代替splitattr()
splithost()
splitnport()
splitpasswd()
splitport()
splitquery()
splittag()
splittype()
splituser()
splitvalue()
to_bytes()
urllib.request
:URLopener
和FancyURLopener
风格的请求调用已被弃用。请使用更新的urlopen()
函数和方法。wsgiref
:SimpleHandler.stdout.write()
不应执行部分写入。xml.etree.ElementTree
:测试Element
的真值已被弃用。在未来的版本中,它将始终返回True
。请优先使用显式的len(elem)
或elem is not None
测试。
CPython 字节码更改¶
如果 yield 是 yield-from 或 await 的一部分,则
YIELD_VALUE
的 oparg 现在为1
,否则为0
。RESUME
的 oparg 已更改,添加了一个位,指示 except-depth 是否为 1,这对于优化生成器的关闭是必需的。(由 Irit Katriel 在 gh-111354 中贡献。)
C API 更改¶
新特性¶
添加 PyMonitoring C API,用于生成 PEP 669 监控事件
(由 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()
函数,用于从字典中移除一个键,并可选择返回移除的值。这类似于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,则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 应该保持可用,请打开一个新 issue 请求公开 C API,并在 issue 中添加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()
,它是为与 Python 3.8 的向后兼容性而保留的PyInterpreterState_Get()
的别名。可以使用 pythoncapi-compat 项目 在 Python 3.8 和更早的版本上获取PyInterpreterState_Get()
。(由 Victor Stinner 在 gh-106320 中贡献。)移除私有的
_PyObject_FastCall()
函数:使用 Python 3.8 版本起可用的PyObject_Vectorcall()
(PEP 590)。(由 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)。在 Python 3.11 中已弃用的用于配置 Python 初始化的函数
PySys_SetArgvEx()
:改为设置PyConfig.argv
。PySys_SetArgv()
:改为设置PyConfig.argv
。Py_SetProgramName()
:改为设置PyConfig.program_name
。Py_SetPythonHome()
:改为设置PyConfig.home
。
应该将
Py_InitializeFromConfig()
API 与PyConfig
一起使用。全局配置变量
Py_QuietFlag
:改为使用PyConfig.quiet
。Py_HashRandomizationFlag
: 请改用PyConfig.use_hash_seed
和PyConfig.hash_seed
。Py_LegacyWindowsFSEncodingFlag
: 请改用PyPreConfig.legacy_windows_fs_encoding
。Py_LegacyWindowsStdioFlag
: 请改用PyConfig.legacy_windows_stdio
。Py_FileSystemDefaultEncoding
: 请改用PyConfig.filesystem_encoding
。Py_HasFileSystemDefaultEncoding
: 请改用PyConfig.filesystem_encoding
。Py_FileSystemDefaultEncodeErrors
: 请改用PyConfig.filesystem_errors
。Py_UTF8Mode
: 请改用PyPreConfig.utf8_mode
。(参见Py_PreInitialize()
)
应该将
Py_InitializeFromConfig()
API 与PyConfig
一起使用。
将在 Python 3.15 中移除¶
捆绑的
libmpdecimal
副本。PyImport_ImportModuleNoBlock()
: 请改用PyImport_ImportModule()
。PyWeakref_GetObject()
和PyWeakref_GET_OBJECT()
: 请改用PyWeakref_GetRef()
。Py_UNICODE
类型和Py_UNICODE_WIDE
宏:请改用wchar_t
。Python 初始化函数
PySys_ResetWarnOptions()
:改为清除sys.warnoptions
和warnings.filters
。Py_GetExecPrefix()
: 请改用sys.base_exec_prefix
和sys.exec_prefix
。Py_GetPath()
:改为获取sys.path
。Py_GetPrefix()
: 请改用sys.base_prefix
和sys.prefix
。Py_GetPythonHome()
: 请改用PyConfig.home
或PYTHONHOME
环境变量。
计划在未来版本中移除¶
以下 API 已弃用,将被移除,尽管目前尚未确定移除日期。
Py_TPFLAGS_HAVE_FINALIZE
: 自 Python 3.8 起不再需要。PySlice_GetIndicesEx()
: 请改用PySlice_Unpack()
和PySlice_AdjustIndices()
。PyUnicode_AsDecodedObject()
: 请改用PyCodec_Decode()
。PyUnicode_AsDecodedUnicode()
: 请改用PyCodec_Decode()
。PyUnicode_AsEncodedObject()
: 请改用PyCodec_Encode()
。PyUnicode_AsEncodedUnicode()
: 请改用PyCodec_Encode()
。PyUnicode_READY()
:自 Python 3.12 起不再需要。PyErr_Display()
: 请改用PyErr_DisplayException()
。_PyErr_ChainExceptions()
: 请改用_PyErr_ChainExceptions1()
。PyBytesObject.ob_shash
成员:请改用PyObject_Hash()
。PyDictObject.ma_version_tag
成员。线程本地存储 (TLS) API
PyThread_ReInitTLS()
:自 Python 3.7 起不再需要。
构建变更¶
arm64-apple-ios
和arm64-apple-ios-simulator
现在都是 PEP 11 第 3 层平台。(PEP 730 由 Russell Keith-Magee 撰写并贡献了实现,参见 gh-114099。)aarch64-linux-android
和x86_64-linux-android
现在都是 PEP 11 第 3 层平台。(PEP 738 由 Malcolm Smith 撰写并贡献了实现,参见 gh-116622。)wasm32-wasi
现在是 PEP 11 第 2 层平台。(由 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 中贡献。)构建
sqlite3
扩展模块需要 SQLite 3.15.2 或更高版本。(由 Erlend Aasland 在 gh-105875 中贡献。)CPython 现在默认捆绑了 mimalloc 库。它在 MIT 许可证下授权;请参阅 mimalloc 许可证。捆绑的 mimalloc 具有自定义更改,请参阅 gh-113141 了解详细信息。(由 Dino Viehland 在 gh-109914 中贡献。)
configure
选项--with-system-libmpdec
现在默认为yes
。libmpdecimal
的捆绑副本将在 Python 3.15 中移除。使用
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¶
本节列出了之前描述的更改和其他可能需要更改代码的错误修复。
Python API 中的更改¶
PEP 667 引入了对
locals()
和f_locals
语义的几项更改在优化作用域中调用
locals()
现在会在每次调用时生成一个独立的快照,因此不再隐式更新先前返回的引用。现在,要获得传统的 CPython 行为,需要显式调用以使用后续调用locals()
的结果来更新最初返回的字典。隐式定位locals()
的代码执行函数(例如exec
和eval
)必须传递一个显式命名空间才能在优化作用域中访问它们的结果。(作为 PEP 667 的一部分进行了更改。)从模块或类作用域中的推导式(包括通过
exec
或eval
)调用locals()
现在再次表现得好像推导式是在独立的嵌套函数中运行一样(即,不包括来自包含作用域的局部变量)。在 Python 3.12 中,在实现 PEP 709 时,此行为已更改为包括来自包含作用域的局部变量。(作为 PEP 667 的一部分进行了更改。)在优化作用域中访问
FrameType.f_locals
现在返回一个直写代理,而不是一个在不确定的时间更新的快照。如果需要快照,则必须使用dict
或代理的.copy()
方法显式创建。(作为 PEP 667 的一部分进行了更改。)
当
functools.partial
用作方法时,现在会发出FutureWarning
。此行为将在未来的 Python 版本中发生更改。如果要保留旧行为,请将其包装在staticmethod()
中。(由 Serhiy Storchaka 在 gh-121027 中贡献。)现在,如果无法检索用户名,
OSError
将由getpass.getuser()
引发,而不是在非 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()
返回 优化作用域 的写入代理时,调用此函数是多余的。
回归测试更改¶
使用
configure
和--with-pydebug
构建的 Python 现在支持-X presite=package.module
命令行选项。 如果使用此选项,它会指定一个模块,该模块应在解释器生命周期的早期导入,在site.py
执行之前。(由 Łukasz Langa 在 gh-110769 中贡献。)
3.13.1 中的重要更改¶
sys¶
之前未公开的特殊函数
sys.getobjects()
,它仅存在于 Python 的特殊构建版本中,现在可能会返回来自其他解释器的对象,而不是调用它的解释器。