Python 3.13 于 2024 年 10 月 7 日发布,带来了语言、实现和标准库方面的诸多改进。本文将重点介绍 Python 3.13 中的主要新特性和更新

本文参考链接:What’s New In Python 3.13

1. 交互式解释器革新

Python 3.13 默认使用一个全新的交互式解释器,该解释器基于 PyPy 项目的代码。这个新解释器带来了众多便捷功能:

  • 多行编辑:支持多行编辑并保留历史记录。
  • REPL 专用命令:直接支持 helpexitquit 等 REPL 命令,无需将它们作为函数调用。
  • 彩色提示和回溯:默认启用彩色提示和回溯信息,提升可读性。
  • 交互式帮助浏览:使用 F1 键浏览交互式帮助,并拥有独立的命令历史记录。
  • 历史记录浏览:使用 F2 键浏览历史记录,可跳过输出以及 >>>... 提示符。
  • 粘贴模式:使用 F3 键进入“粘贴模式”,更方便地粘贴大段代码。

您可以通过设置 PYTHON_BASIC_REPL 环境变量来禁用新交互式解释器。

2. 错误信息优化

  • 彩色回溯:默认情况下,解释器在终端中显示回溯信息时会使用彩色。您可以通过 PYTHON_COLORSNO_COLORFORCE_COLOR 环境变量来控制此功能。
  • 更具指导性的错误提示:当脚本名称与标准库模块或第三方库模块重名时,解释器会提供更明确的错误信息,建议用户重命名脚本。
  • 关键字参数建议:当函数接收到错误的关键字参数时,错误信息会尝试建议正确的关键字参数。

3. 实验性无 GIL 线程支持 (Free-threaded CPython)

CPython 3.13 实验性地支持在禁用全局解释器锁 (GIL) 的情况下运行,也称为自由线程模式。 此功能需要一个不同的可执行文件,通常称为 python3.13tpython3.13t.exe

  • 性能提升: 自由线程模式允许通过在可用的 CPU 核心上并行运行线程来充分利用可用的处理能力。
  • 实验性质: 由于仍处于实验阶段,自由线程模式默认情况下未启用,并且存在一些错误和单线程性能下降问题。

您可以使用 python -VVsys.version 检查当前解释器是否支持自由线程,其中会包含 “experimental free-threading build” 信息。

C 扩展模块需要专门针对自由线程构建,并使用 Py_mod_gil 插槽或 PyUnstable_Module_SetGIL() 函数来指示是否支持在 GIL 禁用的情况下运行。

4. 实验性 JIT 编译器

当使用 --enable-experimental-jit 选项配置和构建 CPython 时,会添加一个实时 (JIT) 编译器,它可以加速某些 Python 程序。 JIT 编译器目前默认禁用,但可能会在之后的版本中启用。

JIT 编译器的内部架构如下:

  • 首先,使用专门的一级字节码
  • 当一级字节码执行次数足够多时,它会被转换为一种新的纯内部中间表示 (IR),称为二级 IR,有时也称为微操作 (“uops”)。
  • 二级 IR 使用与一级相同的基于堆栈的虚拟机,但指令格式更适合转换为机器码。
  • 二级 IR 有多个优化通道,在解释或转换为机器码之前应用。
  • 有一个二级解释器,主要用于调试优化管道的早期阶段。可以使用 --enable-experimental-jit=interpreter 选项配置 Python 来启用二级解释器。
  • 当 JIT 启用时,优化的二级 IR 会被转换为机器码,然后执行。
  • 机器码转换过程使用一种称为复制和修补的技术。它没有运行时依赖项,但有一个新的构建时依赖项,即 LLVM。

5. 对 locals() 的定义性修改语义

Python 3.13 通过 PEP 667 标准化了 CPython 在大多数代码执行作用域中对 locals() 返回值进行修改的历史行为,但将优化作用域(函数、生成器、协程、推导式和生成器表达式)更改为显式返回当前分配的局部变量的独立快照,包括在闭包中捕获的局部引用的非局部变量。

这一变化也影响了隐式定位 locals() 的代码执行函数(例如 exec()eval())的默认行为。 在以前的版本中,调用代码执行函数后,是否可以通过调用 locals() 访问更改取决于具体的实现。

现在,代码将始终针对优化作用域中局部变量的独立快照运行,因此更改永远不会在后续调用 locals() 时可见。 要访问这些情况下的更改,现在必须向相关函数传递一个显式命名空间引用。

6. 移动平台支持

PEP 730 将 iOS 提升为官方支持的平台,支持级别为 3 级。 支持的目标包括:

  • arm64-apple-ios:适用于 2013 年以后发布的 iPhone 和 iPad 设备。
  • arm64-apple-ios-simulator:适用于在 Apple 芯片硬件上运行的 Xcode iOS 模拟器。
  • x86_64-apple-ios-simulator:适用于在较旧的 x86_64 硬件上运行的 Xcode iOS 模拟器,提供尽力而为的支持,但不是 3 级支持平台。

PEP 738 将 Android 提升为官方支持的平台,支持级别为 3 级。 支持的目标包括:

  • aarch64-linux-androidx86_64-linux-android
  • 32 位目标 arm-linux-androideabii686-linux-android 提供尽力而为的支持,但不是 3 级支持平台。

7. 其他语言变更

  • 文档字符串空格处理:编译器现在会从文档字符串的每一行中去除共同的开头空格,这可以减少字节码缓存的大小。
  • 注解作用域:类作用域内的注解作用域现在可以包含 lambda 表达式和推导式。
  • Future 语句:Future 语句不再由 __future__ 模块的相对导入触发。
  • 全局声明:在 except 块中允许使用全局声明,只要该全局变量在 else 块中被使用。
  • 新增属性: 类新增了 __static_attributes__ 属性,用于存储从类主体中任何函数通过 self.X 访问的属性名称。编译器现在会在类上创建一个 __firstlineno__ 属性,其中包含类定义第一行的行号。
  • 新增异常: 新增了 PythonFinalizationError 异常,当操作在终结过程中被阻塞时抛出。

8. 标准库改进

argparse 模块

新增 deprecated 参数到 add_argument()add_parser() 方法,用于标记命令行选项、位置参数和子命令为已弃用状态。

array 模块

  • 新增 w 类型码,用于 Unicode 字符,替代已弃用的 u 类型码。
  • array.array 现在通过实现 clear() 方法注册为 MutableSequence

ast 模块

  • AST 节点构造函数的行为更加严格和直观。
  • ast.parse() 新增 optimize 可选参数,支持获取优化后的 AST。

asyncio 模块

  • as_completed() 现在返回异步迭代器和普通迭代器。
  • 新增队列终止管理功能:Queue.shutdownQueueShutDown
  • Unix socket 服务器关闭时会自动移除 socket 文件。
  • 改进了 TaskGroup 在取消操作时的行为。

base64 模块

新增 z85encode()z85decode() 函数,用于 Z85 数据编解码。

configparser 模块

新增对未命名段的支持,允许顶级键值对。

copy 模块

新增 replace() 函数和替换协议,简化对象修改副本的创建。

ctypes 模块

Structure 对象新增 _align_ 属性,可显式指定结构体内存对齐方式。

dbm 模块

  • 新增 dbm.sqlite3 作为默认 dbm 后端。
  • 新增 clear() 方法,用于移除数据库所有项。

dis 模块

  • 反汇编输出现在显示逻辑标签而不是偏移量。
  • get_instructions() 不再将缓存条目表示为单独指令。

doctest 模块

  • 输出默认带颜色显示。
  • DocTestRunner.run() 现在统计跳过的测试数量。

email 模块

  • 带嵌入换行的头部现在会在输出时被引用。
  • getaddresses()parseaddr() 在遇到无效邮件地址时返回 ('', '')

fractions 模块

Fraction 对象现在支持标准格式规范。

glob 模块

新增 translate() 函数,用于将 shell 风格通配符转换为正则表达式。

importlib 模块

多个函数现在支持访问资源目录,不再计划移除。

io 模块

IOBase 终结器现在会记录 close() 方法产生的错误。

ipaddress 模块

  • 新增 IPv4Address.ipv6_mapped 属性。
  • 修复了 is_globalis_private 的行为。

itertools 模块

batched() 新增 strict 参数,可在最后一批数量不足时抛出异常。

marshal 模块

新增 allow_code 参数控制代码对象序列化。

math 模块

新增 fma() 函数用于融合乘加运算。

mimetypes 模块

新增 guess_file_type() 函数,用于从文件系统路径猜测 MIME 类型。

mmap 模块

  • Windows 下防止内存不可访问时崩溃。
  • 新增 seekable() 方法。
  • Unix 系统新增 trackfd 参数,控制文件描述符复制。

multiprocessing 模块

默认工作线程和进程数现在使用 os.process_cpu_count() 选择。

os 模块

  • 新增 process_cpu_count() 函数获取可用 CPU 核心数。
  • Windows 下支持 lchmod()chmod()follow_symlinks 参数。
  • posix_spawn() 现在接受 None 作为 env 参数。

pathlib 模块

  • 新增 UnsupportedOperation 异常。
  • 新增从 file URI 创建 Path 对象的构造函数。
  • 新增用于匹配 shell 风格通配符的 full_match() 方法。
  • glob()rglob() 支持递归符号链接。

pdb 模块

  • breakpoint()set_trace() 现在立即进入调试器。
  • 支持在后期调试中在链式异常间移动。
  • 支持调试 zipapp

queue 模块

新增 Queue.shutdownShutDown 用于队列终止管理。

random 模块

新增命令行接口。

re 模块

重命名 re.errorPatternError 以提高清晰度。

shutil 模块

chown() 支持 dir_fdfollow_symlinks 关键字参数。

site 模块

.pth 文件现在首先尝试用 UTF-8 解码。

sqlite3 模块

  • Connection 对象未显式关闭时会发出 ResourceWarning
  • Connection.iterdump() 新增 filter 参数。

ssl 模块

create_default_context() API 现在包含新的默认标志。

statistics 模块

  • 新增 kde() 用于核密度估计。
  • 新增 kde_random() 用于从估计的概率密度函数采样。

subprocess 模块

在更多情况下使用 posix_spawn() 函数。

sys 模块

新增 _is_interned() 函数测试字符串是否被驻留。

tempfile 模块

Windows 下 mkdtemp() 默认模式现在限制目录访问。

time 模块

Windows 下 monotonic()time() 精度提升到微秒级。

tkinter 模块

  • 新增多个窗口管理方法。
  • Text.count() 支持返回简单整数。
  • PhotoImage 新增多个图像处理方法。

traceback 模块

  • 新增 exc_type_str 属性。
  • TracebackException.format_exception_only() 新增 show_group 参数。

types 模块

SimpleNamespace 现在可以接受单个位置参数初始化。

typing 模块

  • 新增 ReadOnly 用于标记 TypedDict 项为只读。
  • 新增 TypeIs 用于类型检查器类型收窄。
  • 新增 NoDefault 作为默认参数哨兵对象。

unicodedata 模块

更新 Unicode 数据库到 15.1.0 版本。

venv 模块

新增在虚拟环境目录中创建源代码管理忽略文件的支持。

warnings 模块

新增 deprecated() 装饰器用于标记弃用。

xml 模块

  • 新增控制 Expat 重解析延迟的方法。
  • iterparse() 返回的迭代器新增 close() 方法。

zipimport 模块

新增对 ZIP64 格式文件的支持。

9. 安全性改进

  • ssl.create_default_context() 函数现在默认启用 ssl.VERIFY_X509_PARTIAL_CHAINssl.VERIFY_X509_STRICT 标志,以提高安全性。
  • Windows 上的 os.mkdir()tempfile.mkdtemp() 函数现在支持将 mode 值传递为 0o700,以对新目录应用访问控制,缓解 CVE 2024-4030 漏洞。

10. C API 改进

  • Py_mod_gil 插槽: 现在用于指示扩展模块是否支持在 GIL 禁用的情况下运行。
  • PyTime C API: 新增,提供对系统时钟的访问。
  • PyMutex: 新增,一个轻量级互斥锁,占用单个字节。
  • PEP 669 监控事件生成: 新增一组用于在 C API 中生成监控事件的函数。

11. 新增弃用和移除

  • PEP 594: 从标准库中移除了剩余的 19 个“失效模块”。
  • 移除了 2to3 工具和 lib2to3 模块。
  • 移除了 tkinter.tix 模块。
  • 移除了 locale.resetlocale() 函数。
  • 移除了 typing.iotyping.re 命名空间。
  • 移除了链接的类方法描述符。

12. 版本发布计划变更

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

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

总结

Python 3.13 带来了一系列新特性和改进,特别是在交互式解释器、错误信息、线程模型和 JIT 编译器方面。 这些改进旨在提高 Python 的性能、用户友好性和安全性。 想要了解更多细节,请参阅官方文档和相关的 PEP 文档。


也可以看看