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 文档。








