Python 3.13 于 2024 年 10 月 7 日发布,带来了语言、实现和标准库方面的诸多改进。本文将重点介绍 Python 3.13 中的主要新特性和更新。
本文参考链接:What’s New In Python 3.13
1. 交互式解释器革新
Python 3.13 默认使用一个全新的交互式解释器,该解释器基于 PyPy 项目的代码。这个新解释器带来了众多便捷功能:
- 多行编辑:支持多行编辑并保留历史记录。
- REPL 专用命令:直接支持
help
、exit
和quit
等 REPL 命令,无需将它们作为函数调用。 - 彩色提示和回溯:默认启用彩色提示和回溯信息,提升可读性。
- 交互式帮助浏览:使用
F1
键浏览交互式帮助,并拥有独立的命令历史记录。 - 历史记录浏览:使用
F2
键浏览历史记录,可跳过输出以及>>>
和...
提示符。 - 粘贴模式:使用
F3
键进入“粘贴模式”,更方便地粘贴大段代码。
您可以通过设置 PYTHON_BASIC_REPL
环境变量来禁用新交互式解释器。
2. 错误信息优化
- 彩色回溯:默认情况下,解释器在终端中显示回溯信息时会使用彩色。您可以通过
PYTHON_COLORS
、NO_COLOR
和FORCE_COLOR
环境变量来控制此功能。 - 更具指导性的错误提示:当脚本名称与标准库模块或第三方库模块重名时,解释器会提供更明确的错误信息,建议用户重命名脚本。
- 关键字参数建议:当函数接收到错误的关键字参数时,错误信息会尝试建议正确的关键字参数。
3. 实验性无 GIL 线程支持 (Free-threaded CPython)
CPython 3.13 实验性地支持在禁用全局解释器锁 (GIL) 的情况下运行,也称为自由线程模式。 此功能需要一个不同的可执行文件,通常称为 python3.13t
或 python3.13t.exe
。
- 性能提升: 自由线程模式允许通过在可用的 CPU 核心上并行运行线程来充分利用可用的处理能力。
- 实验性质: 由于仍处于实验阶段,自由线程模式默认情况下未启用,并且存在一些错误和单线程性能下降问题。
您可以使用 python -VV
或 sys.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-android
和x86_64-linux-android
。- 32 位目标
arm-linux-androideabi
和i686-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.shutdown
和QueueShutDown
。 - 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_global
和is_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.shutdown
和 ShutDown
用于队列终止管理。
random 模块
新增命令行接口。
re 模块
重命名 re.error
为 PatternError
以提高清晰度。
shutil 模块
chown()
支持 dir_fd
和 follow_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_CHAIN
和ssl.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.io
和typing.re
命名空间。 - 移除了链接的类方法描述符。
12. 版本发布计划变更
PEP 602 (“Python 的年度发布周期”) 已更新,将新版本的完整支持(“错误修复”)期限延长至两年。 这项更新的政策意味着:
- Python 3.9–3.12 有一年半的完整支持,随后是三年半的安全修复。
- Python 3.13 及更高版本有两年的完整支持,随后是三年的安全修复。
总结
Python 3.13 带来了一系列新特性和改进,特别是在交互式解释器、错误信息、线程模型和 JIT 编译器方面。 这些改进旨在提高 Python 的性能、用户友好性和安全性。 想要了解更多细节,请参阅官方文档和相关的 PEP 文档。