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 个“僵尸电池”(旧版 stdlib 模块)已从标准库中移除:aifcaudioopcgicgitbchunkcryptimghdrmailcapmsilibnisnntplibossaudiodevpipessndhdrspwdsunautelnetlibuuxdrlib

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

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

  • 移除 locale.resetlocale() 函数。

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

  • 移除链接的 classmethod 描述符。

发布计划变更

PEP 602(“Python 的年度发布周期”)已更新,将新版本的完整支持(“错误修复”)周期延长至两年。此更新的政策意味着

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

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

新特性

更好的交互式解释器

Python 现在默认使用一个新的交互式 shell,该 shell 基于 PyPy 项目中的代码。当用户从交互式终端启动 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 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。标记为无线程的预构建二进制文件可以作为官方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,该公司为支持该项目提供了大量的工程资源。

另请参阅

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 解释器,但它主要用于调试优化管道的早期阶段。可以通过使用 --enable-experimental-jit=interpreter 配置 Python 来启用 Tier 2 解释器。

  • 启用 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 目标为第 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-androidx86_64-linux-android 目标为第 3 级支持。32 位目标 arm-linux-androideabii686-linux-android 不是第 3 级支持的平台,但会提供尽力而为的支持。(PEP 由 Malcolm Smith 撰写并贡献了实现,见 gh-116622。)

另请参阅

PEP 730PEP 738

其他语言更改

  • 编译器现在会删除文档字符串中每行开头多余的空格。这减小了 字节码缓存(例如 .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
    

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

  • 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() 内置函数现在接受 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.sqlite3dbm 的 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 映射来选择加入新行为。

    (由 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() 方法。这确保在下一个 await 时会引发 CancelledError,因此取消不会丢失。

    这些更改的一个额外好处是,任务组现在保留取消计数 (cancelling())。

    为了处理一些极端情况,当取消计数达到零时,uncancel() 现在可能会重置未记录的 _must_cancel 标志。

    (受 Arthur Tacca 在 gh-116720 中报告的问题的启发。)

  • 当在非活动的 TaskGroup 上调用 TaskGroup.create_task() 时,将关闭给定的协程(这可以防止出现关于从未等待给定协程的 RuntimeWarning)。(由 Arthur Tacca 和 Jason Zhang 在 gh-115957 中贡献。)

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.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

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.errorPatternError 以提高清晰度。保留 re.error 以实现向后兼容。

shutil

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

site

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

sqlite3

ssl

statistics

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

  • 添加用于从 kde() 创建的估计概率密度函数中采样的 kde_random()。(由 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() 函数来测试字符串是否已被驻留。此函数不保证在 Python 的所有实现中都存在。(由 Serhiy Storchaka 在 gh-78573 中贡献。)

tempfile

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()。将 zoomsubsample 参数添加到 PhotoImage 方法 copy()。(由 Serhiy Storchaka 在 gh-118225 中贡献。)

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

traceback

类型

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

类型提示

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

  • audioop

  • chunk

  • cgicgitb

    • 通常情况下,对于 GETHEAD 请求,可以使用 urllib.parse.parse_qsl() 替换 cgi.FieldStorage;对于 POSTPUT 请求,可以使用 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.EmailMessageemail.message.Message 类。

  • crypt 和私有的 _crypt 扩展。如果只需要对值进行哈希处理,可以使用 hashlib 模块作为合适的替代。否则,可以使用 PyPI 上的各种第三方库。

    • bcrypt:为您的软件和服务器提供现代密码哈希。

    • passlib:全面的密码哈希框架,支持超过 30 种方案。

    • argon2-cffi:安全的 Argon2 密码哈希算法。

    • legacycryptctypes 对 POSIX crypt 库调用及相关功能的包装器。

    • crypt_rcrypt 模块的分支,是对 crypt_r(3) 库调用及相关功能的包装器。

  • 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 模块作为现代替代方案。

  • 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

  • 删除 Python 3.11 中弃用的 locale.resetlocale() 函数。请改用 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

  • 移除在 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

  • 移除自 Python 3.8 以来已弃用的 typing.iotyping.re 命名空间。这些命名空间中的项可以直接从 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 中移除。改用 Unicode 字符的 'w' 格式代码 (Py_UCS4)。(由 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:

    • 弃用未文档化的 glob0()glob1() 函数。请使用 glob() 并传递一个 类路径对象,该对象指定根目录到 root_dir 参数。(由 Barney Gale 在 gh-117337 中贡献。)

  • 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 参数,并弃用将 None 传递给这两种类型的 fields 参数。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 中待删除

Python 3.15 中待移除的功能

  • 导入系统

    • 在未能设置 __spec__.cached 的情况下,在模块上设置 __cached__ 已被弃用。在 Python 3.15 中,导入系统或标准库将不再设置或考虑 __cached__。( gh-97879)

    • 在未能设置 __spec__.parent 的情况下,在模块上设置 __package__ 已被弃用。在 Python 3.15 中,导入系统或标准库将不再设置或考虑 __package__。( gh-97879)

  • ctypes:

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

  • http.server:

    • 过时且很少使用的 CGIHTTPRequestHandler 自 Python 3.13 起已被弃用。没有直接的替代品。与 CGI 相比,*任何东西* 都更适合将 Web 服务器与请求处理程序连接起来。

    • 自 Python 3.13 起,python -m http.server 命令行接口的 --cgi 标志已被弃用。

  • locale:

  • pathlib:

  • platform:

    • 自 Python 3.13 起,java_ver() 已被弃用。此函数仅对 Jython 支持有用,API 令人困惑,并且在很大程度上未经测试。

  • 线程:

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

  • types:

  • typing:

    • 用于创建 NamedTuple 类的未记录的关键字参数语法(例如 Point = NamedTuple("Point", x=int, y=int))自 Python 3.13 起已被弃用。请改用基于类的语法或函数式语法。

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

  • wave:

计划在 Python 3.16 中移除

  • 导入系统

    • 在未能设置 __spec__.loader 的同时设置模块的 __loader__ 已被弃用。在 Python 3.16 中,导入系统或标准库将不再设置或考虑 __loader__

  • array:

    • 'u' 格式代码(wchar_t)自 Python 3.3 起在文档中已被弃用,自 Python 3.13 起在运行时已被弃用。请改用 'w' 格式代码(Py_UCS4)表示 Unicode 字符。

  • asyncio:

  • builtins:

    • 自 Python 3.12 起,布尔类型的按位取反,~True~False 已被弃用,因为它会产生令人惊讶且不直观的结果(-2-1)。请改用 not x 来进行布尔值的逻辑否定。在极少数情况下,如果您需要底层整数的按位取反,请显式转换为 int~int(x))。

  • shutil:

    • 自 Python 3.14 起,ExecError 异常已被弃用。自 Python 3.4 以来,shutil 中的任何函数都未使用过它,现在它是 RuntimeError 的别名。

  • 符号表:

  • sys:

  • tarfile:

    • 自 Python 3.13 起,未记录且未使用的 TarFile.tarfile 属性已被弃用。

计划在未来版本中移除

以下 API 将在未来移除,尽管目前尚未安排移除的日期。

  • argparse:嵌套参数组和嵌套互斥组已被弃用。

  • array'u' 格式代码 (gh-57281)

  • builtins:

    • bool(NotImplemented).

    • 生成器: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)

    • 对返回非 int 类型的 __index__()__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 中贡献。)

  • codeobject.co_lnotab:请使用 codeobject.co_lines() 方法代替。

  • datetime:

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

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

  • gettext:复数形式的值必须为整数。

  • importlib:

    • load_module() 方法:请使用 exec_module() 代替。

    • cache_from_source()debug_override 参数已被弃用:请使用 optimization 参数代替。

  • 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.SSLContextset_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 方法

  • typing.Text (gh-92332)。

  • unittest.IsolatedAsyncioTestCase:从测试用例中返回不是 None 的值已被弃用。

  • urllib.parse 中已弃用的函数:请使用 urlparse() 代替

    • splitattr()

    • splithost()

    • splitnport()

    • splitpasswd()

    • splitport()

    • splitquery()

    • splittag()

    • splittype()

    • splituser()

    • splitvalue()

    • to_bytes()

  • urllib.requestURLopenerFancyURLopener 风格的请求调用已被弃用。请使用更新的 urlopen() 函数和方法。

  • wsgirefSimpleHandler.stdout.write() 不应执行部分写入。

  • xml.etree.ElementTree:测试 Element 的真值已被弃用。在未来的版本中,它将始终返回 True。请优先使用显式的 len(elem)elem is not None 测试。

  • zipimport.zipimporter.load_module() 已被弃用:请改用 exec_module()

CPython 字节码更改

  • 如果 yield 是 yield-from 或 await 的一部分,则 YIELD_VALUE 的 oparg 现在为 1,否则为 0RESUME 的 oparg 已更改,添加了一个位,指示 except-depth 是否为 1,这对于优化生成器的关闭是必需的。(由 Irit Katriel 在 gh-111354 中贡献。)

C API 更改

新特性

更改的 C API

有限 C API 更改

删除的 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 中已弃用的各种函数

    (由 Victor Stinner 在 gh-105107 中贡献。)

  • 移除以下在 Python 3.11 中已弃用的用于配置 Python 初始化的旧函数

    使用 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_BEGINPy_TRASHCAN_SAFE_END。将两者都替换为新的宏 Py_TRASHCAN_BEGINPy_TRASHCAN_END。(由 Irit Katriel 在 gh-105111 中贡献。)

已弃用的 C API

计划在 Python 3.14 中移除

将在 Python 3.15 中移除

计划在未来版本中移除

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

构建变更

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

  • aarch64-linux-androidx86_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 现在默认为 yeslibmpdecimal 的捆绑副本将在 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() 的代码执行函数(例如 execeval)必须传递一个显式命名空间才能在优化作用域中访问它们的结果。(作为 PEP 667 的一部分进行了更改。)

    • 从模块或类作用域中的推导式(包括通过 execeval)调用 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.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 中贡献。)

  • PEP 667 引入了与帧相关的函数的几项更改

回归测试更改

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

3.13.1 中的重要更改

sys

  • 之前未公开的特殊函数 sys.getobjects(),它仅存在于 Python 的特殊构建版本中,现在可能会返回来自其他解释器的对象,而不是调用它的解释器。