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


解释器的改进

Python 数据模型改进

标准库的重大改进

安全改进

C API 的改进

  • Py_mod_gil 插槽现在用于指示扩展模块支持在禁用GIL 的情况下运行。

  • PyTime C API 已添加,提供对系统时钟的访问。

  • PyMutex 是一个新的轻量级互斥锁,占用一个字节。

  • C API 中有一套新函数用于生成PEP 669 监控事件。

新的类型特性

平台支持

重要移除

  • PEP 594:剩余的 19 个“废弃的模块”(遗留标准库模块)已从标准库中移除:aifcaudioopcgicgitbchunkcryptimghdrmailcapmsilibnisnntplibossaudiodevpipessndhdrspwdsunautelnetlibuuxdrlib

  • 移除 2to3 工具和 lib2to3 模块(在 Python 3.11 中已弃用)。

  • 移除 tkinter.tix 模块(在 Python 3.6 中已弃用)。

  • 移除 locale.resetlocale() 函数。

  • 移除 typing.iotyping.re 命名空间。

  • 移除链式 classmethod 描述符。

发布计划变更

PEP 602(“Python 年度发布周期”)已更新,将新版本的完全支持(“bugfix”)期限延长至两年。此更新的策略意味着:

  • Python 3.9–3.12 有一年半的完全支持,随后是三年半的安全修复。

  • Python 3.13 及更高版本有两年的完全支持,随后是三年的安全修复。

新功能

一个更好的交互式解释器

Python 现在默认使用基于 PyPy 项目代码的新交互式 shell。当用户从交互式终端启动 REPL 时,现在支持以下新功能:

  • 多行编辑并保留历史记录。

  • 直接支持 REPL 特定命令,如 helpexitquit,无需将其作为函数调用。

  • 提示符和回溯默认启用颜色

  • 使用 F1 进行交互式帮助浏览,并带有单独的命令历史记录。

  • 使用 F2 浏览历史记录,跳过输出以及 >>>... 提示符。

  • 使用 F3 的“粘贴模式”使粘贴更大的代码块更容易(再次按 F3 返回到常规提示符)。

要禁用新的交互式 shell,请设置 PYTHON_BASIC_REPL 环境变量。有关交互模式的更多信息,请参阅交互模式

(由 Pablo Galindo Salgado、Łukasz Langa 和 Lysandros Nikolaou 在 gh-111201 中贡献,基于 PyPy 项目的代码。Windows 支持由 Dino Viehland 和 Anthony Shaw 贡献。)

改进的错误消息

  • 解释器现在默认在终端显示回溯时使用颜色。此功能可以通过新的 PYTHON_COLORS 环境变量以及规范的 NO_COLORFORCE_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.13tpython3.13t.exe。标记为 free-threaded 的预构建二进制文件可以作为官方 WindowsmacOS 安装程序的一部分安装,或者可以使用 --disable-gil 选项从源代码构建 CPython。

自由线程执行允许通过在可用 CPU 核心上并行运行线程来充分利用可用的处理能力。虽然并非所有软件都会自动从中受益,但考虑到线程设计的程序在多核硬件上会运行得更快。自由线程模式是实验性的,改进工作正在进行中:预计会有一些错误和显着的单线程性能损失。CPython 的自由线程构建支持在运行时使用环境变量 PYTHON_GIL 或命令行选项 -X gil=1 可选地启用 GIL。

要检查当前解释器是否支持自由线程,python -VVsys.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 为支持此项目提供了大量的工程资源。

参见

PEP 703 “使 CPython 中的全局解释器锁可选”包含有关这项工作的原理和信息。

移植扩展模块以支持自由线程:一个由社区维护的扩展作者移植指南。

一个实验性的即时 (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 的构建时依赖。

参见

PEP 744

(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 APIC API 的移植说明。

(PEP 和实现由 Mark Shannon 和 Tian Gao 在 gh-74929 中贡献。文档更新由 Guido van Rossum 和 Alyssa Coghlan 提供。)

支持移动平台

PEP 730:iOS 现在是PEP 11 支持的平台,arm64-apple-iosarm64-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-androidx86_64-linux-android 目标位于 Tier 3。32 位目标 arm-linux-androideabii686-linux-android 不是 Tier 3 支持的平台,但将获得尽力支持。(PEP 由 Malcolm Smith 编写并贡献实现,见 gh-116622。)

参见

PEP 730, PEP 738

其他语言更改

  • 编译器现在从 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
    

    (由 Jelle Zijlstra 在 gh-109118gh-118160 中贡献。)

  • 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() 内置函数现在接受 globalslocals 参数作为关键字参数。(由 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 中贡献。)

  • bz2lzmatarfilezipfile 模块中,为压缩和存档的类文件对象添加了 namemode 属性。(由 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 映射来选择新行为。

    (由 Jelle Zijlstra 在 gh-105858gh-117486gh-118851 中贡献。)

  • 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.shutdownQueueShutDown 以管理队列终止。(由 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

compileall

concurrent.futures

configparser

  • ConfigParser 现在支持无名节,这允许顶级键值对。这可以通过新的 allow_unnamed_section 参数启用。(由 Pedro Sousa Lacerda 在 gh-66449 中贡献。)

copy

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

email

  • 现在,输出中包含换行符的标头将用引号括起来。generator 现在将拒绝序列化(写入)格式不正确或分隔不当的标头,以免它们被解析为多个标头或与相邻数据连接。如果需要关闭此安全功能,请设置 verify_generated_headers。(由 Bas Bloemsaat 和 Petr Viktorin 在 gh-121650 中贡献。)

  • getaddresses()parseaddr() 现在在遇到无效电子邮件地址的更多情况下返回 ('', '') 对,而不是可能不准确的值。这两个函数都有一个新的可选 strict 参数(默认为 True)。要获取旧行为(接受格式错误输入),请使用 strict=Falsegetattr(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

io

ipaddress

itertools

  • batched() 有一个新的 strict 参数,如果最终批次短于指定的批次大小,则会引发 ValueError。(由 Raymond Hettinger 在 gh-113202 中贡献。)

marshal

  • 在模块函数中添加 allow_code 参数。传递 allow_code=False 可防止序列化和反序列化在 Python 版本之间不兼容的代码对象。(由 Serhiy Storchaka 在 gh-113626 中贡献。)

math

  • 新函数 fma() 执行融合乘加运算。它只进行一次舍入计算 x * y + z,从而避免任何中间精度损失。它封装了 C99 提供的 fma() 函数,并遵循 IEEE 754“fusedMultiplyAdd”特殊情况操作的规范。(由 Mark Dickinson 和 Victor Stinner 在 gh-73468 中贡献。)

mimetypes

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

os.path

  • 添加 isreserved() 以检查路径是否在当前系统上保留。此函数仅在 Windows 上可用。(由 Barney Gale 在 gh-88569 中贡献。)

  • 在 Windows 上,isabs() 不再将以恰好一个斜杠(\/)开头的路径视为绝对路径。(由 Barney Gale 和 Jon Foster 在 gh-44626 中贡献。)

  • realpath() 现在即使文件不可访问,也会解析 MS-DOS 风格的文件名。(由 Moonsik Park 在 gh-82367 中贡献。)

pathlib

pdb

  • breakpoint()set_trace() 现在立即进入调试器,而不是在下一行代码执行时。此更改可防止调试器在 breakpoint() 位于上下文末尾时跳出上下文。(由 Tian Gao 在 gh-118579 中贡献。)

  • sys.flags.safe_path 设置时,sys.path[0] 不再被调试脚本的目录替换。(由 Tian Gao 和 Christian Walther 在 gh-111762 中贡献。)

  • zipapp 现在支持作为调试目标。(由 Tian Gao 在 gh-118501 中贡献。)

  • pm() 中,通过新的 Pdb 命令 exceptions [exc_number],增加了在事后调试期间在链式异常之间移动的功能。(由 Matthias Bussonnier 在 gh-106676 中贡献。)

  • 前缀为 pdb 命令的表达式和语句现在可以正确识别和执行。(由 Tian Gao 在 gh-108464 中贡献。)

queue

random

re

  • 为了提高清晰度,将 re.error 重命名为 PatternErrorre.error 保留以实现向后兼容性。

shutil

  • chown() 中支持 dir_fdfollow_symlinks 关键字参数。(由 Berker Peksag 和 Tahia K 在 gh-62308 中贡献)

site

  • .pth 文件现在首先使用 UTF-8 解码,如果 UTF-8 解码失败,则使用 locale 编码解码。(由 Inada Naoki 在 gh-117802 中贡献。)

sqlite3

ssl

statistics

  • 添加 kde() 用于核密度估计。这使得可以从固定数量的离散样本估计连续概率密度函数。(由 Raymond Hettinger 在 gh-115863 中贡献。)

  • 添加 kde_random() 用于从 kde() 创建的估计概率密度函数进行采样。(由 Raymond Hettinger 在 gh-115863 中贡献。)

subprocess

  • subprocess 模块现在在更多情况下使用 posix_spawn() 函数。

    值得注意的是,当 close_fdsTrue(默认值)时,如果 C 库提供 posix_spawn_file_actions_addclosefrom_np(),将使用 posix_spawn(),这包括最新版本的 Linux、FreeBSD 和 Solaris。在 Linux 上,这应该与现有的基于 Linux vfork() 的代码性能相似。

    如果需要强制 subprocess 从不使用 posix_spawn(),可以将私有控制旋钮 subprocess._USE_POSIX_SPAWN 设置为 False。如果您设置了此值,请在 问题跟踪器 中报告您的原因和平台详细信息,以便我们为所有人改进 API 选择逻辑。(由 Jakub Kulik 在 gh-113117 中贡献。)

sys

  • 添加 _is_interned() 函数,用于测试字符串是否已被 intern。此函数不保证存在于所有 Python 实现中。(由 Serhiy Storchaka 在 gh-78573 中贡献。)

tempfile

时间

  • 在 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.Styleelement_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() 添加 zoomsubsample 参数。(由 Serhiy Storchaka 在 gh-118225 中贡献。)

  • 添加 PhotoImage 方法 read() 以从文件读取图像,以及 data() 以获取图像数据。向 write() 方法添加 backgroundgrayscale 参数。(由 Serhiy Storchaka 在 gh-118271 中贡献。)

traceback

types

  • SimpleNamespace 现在可以接受单个位置参数来初始化命名空间的参数。此参数必须是映射或键值对的可迭代对象。(由 Serhiy Storchaka 在 gh-108191 中贡献。)

typing

unicodedata

venv

  • 添加对在虚拟环境目录中创建源代码控制管理 (SCM) 忽略文件的支持。默认情况下,支持 Git。这通过 API 作为可选功能实现,可以扩展以支持其他 SCM(EnvBuildercreate()),并通过 CLI 使用 --without-scm-ignore-files 作为可选退出功能。(由 Brett Cannon 在 gh-108125 中贡献。)

warnings

xml

zipimport

  • 添加对 ZIP64 格式文件的支持。每个人都喜欢大数据,对吧?(由 Tim Hatch 在 gh-94146 中贡献。)

优化

  • 几个标准库模块的导入时间得到了显著改善。例如,通过移除对 recontextlib 的依赖,typing 模块的导入时间减少了大约三分之一。其他导入时间得到加速的模块包括 email.utilsenumfunctoolsimportlib.metadatathreading。(由 Alex Waygood、Shantanu Jain、Adam Turner、Daniel Hollas 等人在 gh-109653 中贡献。)

  • 对于大型输入,textwrap.indent() 现在比以前快约 30%。(由 Inada Naoki 在 gh-107369 中贡献。)

  • subprocess 模块现在在更多情况下使用 posix_spawn() 函数,包括在许多现代平台上 close_fdsTrue(默认值)时。这应该会在 FreeBSD 和 Solaris 上启动进程时提供显著的性能提升。有关详细信息,请参阅上面的 subprocess 部分。(由 Jakub Kulik 在 gh-113117 中贡献。)

已移除的模块和 API

PEP 594:从标准库中移除“死电池”

PEP 594 提议从标准库中移除 19 个模块,俗称“死电池”,因为它们具有历史性、过时或不安全的地位。以下所有模块在 Python 3.11 中已弃用,现在已被移除:

  • aifc

    • standard-aifc:使用 PyPI 中 aifc 库的重新分发版本。

  • audioop

  • chunk

  • cgicgitb

    • cgi.FieldStorage 通常可以替换为 urllib.parse.parse_qsl() 用于 GETHEAD 请求,以及 email.message 模块或 multipart 库用于 POSTPUT 请求。

    • 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.EmailMessageemail.message.Message 类。

    • standard-cgi:和 standard-cgitb:使用 PyPI 中 cgicgitb 库的重新分发版本。

  • crypt 和私有 _crypt 扩展。当只需要对值进行哈希时,hashlib 模块可能是合适的替代品。否则,PyPI 上有各种第三方库可用:

  • imghdr:应使用 filetypepuremagicpython-magic 库作为替代品。例如,puremagic.what() 函数可用于替换 imghdr.what() 函数,适用于 imghdr 支持的所有文件格式。

  • mailcap:请改用 mimetypes 模块。

  • msilib

  • nis

  • nntplib:请改用 PyPI 中的 pynntp 库。

  • ossaudiodev:对于音频播放,请改用 PyPI 中的 pygame 库。

  • pipes:请改用 subprocess 模块。使用 shlex.quote() 替换未文档化的 pipes.quote 函数。

  • sndhdr:应使用 filetypepuremagicpython-magic 库作为替代品。

  • spwd:请改用 PyPI 中的 python-pam 库。

  • sunau

  • telnetlib:请改用 PyPI 中的 telnetlib3Exscript 库。

  • uu:请改用 base64 模块作为现代替代方案。

    • standard-uu:使用 PyPI 中 uu 库的重新分发版本。

  • xdrlib

(由 Victor Stinner 和 Zachary Ware 在 gh-104773gh-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

locale

  • 移除 locale.resetlocale() 函数,该函数在 Python 3.11 中已弃用。请改用 locale.setlocale(locale.LC_ALL, "")。(由 Victor Stinner 在 gh-104783 中贡献。)

opcode

  • opcode.ENABLE_SPECIALIZATION 移至 _opcode.ENABLE_SPECIALIZATION。此字段在 3.12 中添加,从未被文档化,不打算供外部使用。(由 Irit Katriel 在 gh-105481 中贡献。)

  • 移除 opcode.is_pseudo()opcode.MIN_PSEUDO_OPCODEopcode.MAX_PSEUDO_OPCODE,它们在 Python 3.12 中添加,但既未文档化,也未通过 dis 公开,也不打算供外部使用。(由 Irit Katriel 在 gh-105481 中贡献。)

optparse

  • 此模块不再被视为 软弃用。虽然对于不使用第三方命令行参数处理库的新项目,仍然首选 argparse,但 argparse 的工作方式有些方面意味着较低级别的 optparse 模块可能为 编写 参数处理库和实现比 argparse 更严格遵循源于 C getopt() 函数行为的各种 Unix 命令行处理约定的命令行应用程序提供更好的基础。(由 Alyssa Coghlan 和 Serhiy Storchaka 在 gh-126180 中贡献。)

pathlib

  • 移除了将 Path 对象用作上下文管理器的功能。此功能已弃用,自 Python 3.9 起已失效。(由 Barney Gale 在 gh-83863 中贡献。)

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

  • 移除了 typing.iotyping.re 命名空间,这些命名空间自 Python 3.8 起已弃用。这些命名空间中的项可以直接从 typing 模块导入。(由 Sebastian Rittau 在 gh-92871 中贡献。)

  • 移除了创建 TypedDict 类型时的关键字参数方法,该方法在 Python 3.11 中已弃用。(由 Tomas Roun 在 gh-104786 中贡献。)

unittest

urllib

webbrowser

  • 移除了未经测试且未文档化的 MacOSX 类,该类在 Python 3.11 中已弃用。请改用 MacOSXOSAScript 类(在 Python 3.2 中引入)。(由 Hugo van Kemenade 在 gh-104804 中贡献。)

  • 移除了已弃用的 MacOSXOSAScript._name 属性。请改用 MacOSXOSAScript.name 属性。(由 Nikita Sobolev 在 gh-105546 中贡献。)

新弃用

  • 用户自定义函数:

    • 弃用对函数 __code__ 属性的赋值,其中新代码对象的类型与函数的类型不匹配。不同的类型有:普通函数、生成器、异步生成器和协程。(由 Irit Katriel 在 gh-81137 中贡献。)

  • array:

    • 弃用运行时 'u' 格式代码 (wchar_t)。此格式代码自 Python 3.3 起在文档中弃用,并将在 Python 3.16 中移除。请改用 'w' 格式代码 (Py_UCS4) 处理 Unicode 字符。(由 Hugo van Kemenade 在 gh-80480 中贡献。)

  • ctypes:

    • 弃用未文档化的 SetPointerType() 函数,该函数将在 Python 3.15 中移除。(由 Victor Stinner 在 gh-105733 中贡献。)

    • 软弃用 ARRAY() 函数,转而支持 type * length 乘法。(由 Victor Stinner 在 gh-105733 中贡献。)

  • decimal:

    • 弃用非标准且未文档化的 Decimal 格式说明符 'N',该说明符仅在 decimal 模块的 C 实现中受支持。(由 Serhiy Storchaka 在 gh-89902 中贡献。)

  • dis:

    • 弃用 HAVE_ARGUMENT 分隔符。请改用 hasarg 中的成员资格检查。(由 Irit Katriel 在 gh-109319 中贡献。)

  • gettext:

    • 弃用在 gettext 模块中,即使未找到翻译,将非整数数字作为考虑复数形式的函数和方法的参数的做法。(由 Serhiy Storchaka 在 gh-88434 中贡献。)

  • glob:

  • http.server:

    • 弃用 CGIHTTPRequestHandler,该类将在 Python 3.15 中移除。基于进程的 CGI HTTP 服务器已经失宠很长时间了。此代码已过时、未维护且很少使用。它具有很高的安全性和功能错误潜力。(由 Gregory P. Smith 在 gh-109096 中贡献。)

    • 弃用 python -m http.server 命令行界面的 --cgi 标志,该标志将在 Python 3.15 中移除。(由 Gregory P. Smith 在 gh-109096 中贡献。)

  • mimetypes:

  • re:

    • 弃用将可选的 maxsplitcountflags 参数作为位置参数传递给模块级 split()sub()subn() 函数的做法。这些参数将在 Python 的未来版本中变为 仅限关键字。(由 Serhiy Storchaka 在 gh-56166 中贡献。)

  • pathlib:

  • platform:

    • 弃用 java_ver(),该函数将在 Python 3.15 中移除。此函数仅对 Jython 支持有用,API 令人困惑,且大部分未经测试。(由 Nikita Sobolev 在 gh-116349 中贡献。)

  • pydoc:

    • 弃用未文档化的 ispackage() 函数。(由 Zackery Spytz 在 gh-64020 中贡献。)

  • sqlite3:

  • sys:

  • tarfile:

    • 弃用未文档化且未使用的 TarFile.tarfile 属性,该属性将在 Python 3.16 中移除。(在 gh-115256 中贡献。)

  • traceback:

  • typing:

    • 弃用创建 NamedTuple 类的未文档化关键字参数语法(例如 Point = NamedTuple("Point", x=int, y=int)),该语法将在 Python 3.15 中移除。请改用基于类的语法或函数式语法。(由 Alex Waygood 在 gh-105566 中贡献。)

    • 弃用创建 NamedTupletyping.TypedDict 类时省略 fields 参数,并弃用向这两种类型的 fields 参数传递 None。Python 3.15 将要求 fields 参数为有效的序列。要创建零字段的 NamedTuple 类,请使用 class NT(NamedTuple): passNT = NamedTuple("NT", ())。要创建零字段的 TypedDict 类,请使用 class TD(TypedDict): passTD = TypedDict("TD", {})。(由 Alex Waygood 在 gh-105566gh-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:

Python 3.14 中即将移除

  • argparseargparse.BooleanOptionalActiontypechoicesmetavar 参数已弃用,并将在 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:

    • 子进程观察器类 asyncio.MultiLoopChildWatcherasyncio.FastChildWatcherasyncio.AbstractChildWatcherasyncio.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'。请参阅 上下文和启动方法

  • pathlibis_relative_to()relative_to():传递额外参数已弃用。

  • pkgutilpkgutil.find_loader()pkgutil.get_loader() 现在会引发 DeprecationWarning;请改用 importlib.util.find_spec()。(由 Nikita Sobolev 在 gh-97850 中贡献。)

  • pty:

  • sqlite3:

  • urlliburllib.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:

    • 未写入文档的 ctypes.SetPointerType() 函数自 Python 3.13 起已被弃用。

  • http.server:

    • 过时且很少使用的 CGIHTTPRequestHandler 已从 Python 3.13 开始弃用。没有直接的替代品。任何将 Web 服务器与请求处理程序对接的方式都比 CGI 好。

    • python -m http.server 命令行界面的 --cgi 旗标已自 Python 3.13 起弃用。

  • importlib:

    • load_module() 方法:请改用 exec_module()

  • locale:

  • pathlib:

  • platform:

    • java_ver() 已自 Python 3.13 起弃用。此函数仅对 Jython 支持有用,其 API 令人困惑,且基本未经测试。

  • sysconfig:

  • threading:

    • RLock() 在 Python 3.15 中将不再接受任何参数。自 Python 3.14 起,传递任何参数的行为已被弃用,因为 Python 版本不允许任何参数,但 C 版本允许任意数量的位置或关键字参数,并会忽略所有参数。

  • types:

  • typing:

    • 用于创建 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): passTD = TypedDict("TD", {}) 来创建零字段的 TypedDict。

    • typing.no_type_check_decorator() 装饰器函数已自 Python 3.13 起弃用。在 typing 模块中存在八年后,它仍未被任何主流类型检查器支持。

  • wave:

  • zipimport:

计划在 Python 3.16 中移除

计划在 Python 3.17 中移除

  • collections.abc:

    • collections.abc.ByteString 计划在 Python 3.17 中移除。

      要测试 obj 是否在运行时实现了缓冲区协议,请使用 isinstance(obj, collections.abc.Buffer)。在类型注解中,请使用 Buffer 或显式指定代码支持的类型的联合类型(例如 bytes | bytearray | memoryview)。

      ByteString 最初旨在作为 bytesbytearray 的超类型抽象类。然而,由于该 ABC 从未有任何方法,因此知道一个对象是 ByteString 的实例实际上并未提供关于该对象的任何有用信息。其他常见的缓冲区类型(例如 memoryview)也从未被理解为 ByteString 的子类型(无论是在运行时还是通过静态类型检查器)。

      有关更多详细信息,请参阅 PEP 688。(由 Shantanu Jain 在 gh-91896 中贡献。)

  • typing:

    • 在 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 最初旨在作为 bytesbytearray 的超类型抽象类。然而,由于该 ABC 从未有任何方法,因此知道一个对象是 ByteString 的实例实际上并未提供关于该对象的任何有用信息。其他常见的缓冲区类型(例如 memoryview)也从未被理解为 ByteString 的子类型(无论是在运行时还是通过静态类型检查器)。

      有关更多详细信息,请参阅 PEP 688。(由 Shantanu Jain 在 gh-91896 中贡献。)

计划在未来版本中移除

以下 API 将在未来移除,但目前尚未确定移除日期。

  • argparse:

    • 嵌套参数组和嵌套互斥组的做法已被弃用。

    • add_argument_group() 传递未写入文档的关键字参数 prefix_chars 的做法现已弃用。

    • argparse.FileType 类型转换器已被弃用。

  • builtins:

    • 生成器:throw(type, exc, tb)athrow(type, exc, tb) 签名已被弃用:请改用单参数签名的 throw(exc)athrow(exc)

    • 目前 Python 接受数字字面量紧跟关键字,例如 0in x1or x0if 1else 2。它允许令人困惑和模棱两可的表达式,如 [0x1for x in y](可解释为 [0x1 for x in y][0x1f or x in y])。如果数字字面量紧跟关键字 andelseforifinisor 之一,则会引发语法警告。在未来的版本中,这将更改为语法错误。( gh-87999 )

    • __index__()__int__() 方法返回非 int 类型的支持:这些方法将被要求返回 int 的严格子类的实例。

    • __float__() 方法返回 float 的严格子类的支持:这些方法将被要求返回 float 的实例。

    • __complex__() 方法返回 complex 的严格子类的支持:这些方法将被要求返回 complex 的实例。

    • int() 委托给 __trunc__() 方法的做法。

    • complex() 构造函数中将复数作为 realimag 参数传递的做法现已弃用;它应该仅作为单个位置参数传递。(由 Serhiy Storchaka 在 gh-109218 中贡献。)

  • calendarcalendar.Januarycalendar.February 常量已弃用,并由 calendar.JANUARYcalendar.FEBRUARY 取代。(由 Prince Roshan 在 gh-103636 中贡献。)

  • codecs:请使用 open() 而不是 codecs.open()。(gh-133038

  • codeobject.co_lnotab:请改用 codeobject.co_lines() 方法。

  • datetime:

    • utcnow():请使用 datetime.datetime.now(tz=datetime.UTC)

    • utcfromtimestamp():请使用 datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)

  • gettext:复数值必须是整数。

  • importlib:

  • importlib.metadata:

    • EntryPoints 元组接口。

    • 返回值的隐式 None

  • loggingwarn() 方法已自 Python 3.3 起弃用,请改用 warning()

  • mailbox:使用 StringIO 输入和文本模式已被弃用,请改用 BytesIO 和二进制模式。

  • os:在多线程进程中调用 os.register_at_fork()

  • pydoc.ErrorDuringImportexc_info 参数使用元组值的做法已被弃用,请改用异常实例。

  • re:现在对正则表达式中的数字组引用和组名应用了更严格的规则。现在只接受 ASCII 数字序列作为数字引用。字节串模式和替换字符串中的组名现在只能包含 ASCII 字母、数字和下划线。(由 Serhiy Storchaka 在 gh-91760 中贡献。)

  • sre_compilesre_constantssre_parse 模块。

  • shutilrmtree()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 方法

  • typing.Text (gh-92332)。

  • 内部类 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()

  • wsgirefSimpleHandler.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,否则为 0RESUME 的操作码已更改,添加了一个位,指示 except-depth 是否为 1,这对于优化生成器的关闭是必需的。(由 Irit Katriel 在 gh-111354 中贡献。)

C API 更改

新功能

已更改的 C API

受限 C API 更改

已移除的 C API

已弃用的 C API

Python 3.14 中即将移除

Python 3.15 中即将移除

Python 3.16 中即将移除

  • 捆绑的 libmpdec 副本。

计划在 Python 3.18 中移除

未来版本中即将移除

以下 API 已被弃用并将被移除,但目前尚未确定移除日期。

构建更改

  • arm64-apple-iosarm64-apple-ios-simulator 现在都是 PEP 11 第三层平台。(Russell Keith-Magee 贡献了 PEP 730 的编写和实现,参见 gh-114099。)

  • aarch64-linux-androidx86_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

  • errnofcntlgrpmd5pwdresourcetermioswinsound_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() 为目标的代码执行函数(例如 execeval)必须传递一个显式命名空间才能在优化范围内访问其结果。(作为 PEP 667 的一部分进行了更改。)

    • 在模块或类作用域的推导式中调用 locals() (包括通过 execeval) 再次表现为推导式作为独立的嵌套函数运行 (即不包含包含作用域中的局部变量)。在 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.GzipFilemode 属性的值现在是字符串('rb''wb'),而不是整数(12)。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_tptrdiff_t 类型。显式包含 <stddef.h> 已经被所有其他平台所需要,HAVE_STDDEF_H 宏只在 Windows 上定义。(由 Victor Stinner 在 gh-108765 中贡献。)

  • 如果定义了 Py_LIMITED_API 宏,则 Py_BUILD_COREPy_BUILD_CORE_BUILTINPy_BUILD_CORE_MODULE 宏现在会被 <Python.h> 取消定义。(由 Victor Stinner 在 gh-85283 中贡献。)

  • 旧的垃圾回收宏 Py_TRASHCAN_SAFE_BEGINPy_TRASHCAN_SAFE_END 已被移除。它们应该被新的宏 Py_TRASHCAN_BEGINPy_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 中贡献。)

回归测试更改

  • 使用 configure --with-pydebug 构建的 Python 现在支持 -X presite=package.module 命令行选项。如果使用,它指定一个模块,该模块应在解释器生命周期的早期,即在执行 site.py 之前导入。(由 Łukasz Langa 在 gh-110769 中贡献。)