Python 3.13 于 2024 年 10 月 7 日发布,带来了语言、实现和标准库方面的诸多改进。本文将重点介绍 Python 3.13 中的主要新特性和更新。
本文参考链接:What’s New In Python 3.13
Python 3.13 默认使用一个全新的交互式解释器,该解释器基于 PyPy 项目的代码。这个新解释器带来了众多便捷功能:
help
、exit
和 quit
等 REPL 命令,无需将它们作为函数调用。F1
键浏览交互式帮助,并拥有独立的命令历史记录。F2
键浏览历史记录,可跳过输出以及 >>>
和 ...
提示符。F3
键进入“粘贴模式”,更方便地粘贴大段代码。您可以通过设置 PYTHON_BASIC_REPL
环境变量来禁用新交互式解释器。
PYTHON_COLORS
、NO_COLOR
和 FORCE_COLOR
环境变量来控制此功能。CPython 3.13 实验性地支持在禁用全局解释器锁 (GIL) 的情况下运行,也称为自由线程模式。 此功能需要一个不同的可执行文件,通常称为 python3.13t
或 python3.13t.exe
。
您可以使用 python -VV
或 sys.version
检查当前解释器是否支持自由线程,其中会包含 “experimental free-threading build” 信息。
C 扩展模块需要专门针对自由线程构建,并使用 Py_mod_gil
插槽或 PyUnstable_Module_SetGIL()
函数来指示是否支持在 GIL 禁用的情况下运行。
当使用 --enable-experimental-jit
选项配置和构建 CPython 时,会添加一个实时 (JIT) 编译器,它可以加速某些 Python 程序。 JIT 编译器目前默认禁用,但可能会在之后的版本中启用。
JIT 编译器的内部架构如下:
--enable-experimental-jit=interpreter
选项配置 Python 来启用二级解释器。Python 3.13 通过 PEP 667 标准化了 CPython 在大多数代码执行作用域中对 locals()
返回值进行修改的历史行为,但将优化作用域(函数、生成器、协程、推导式和生成器表达式)更改为显式返回当前分配的局部变量的独立快照,包括在闭包中捕获的局部引用的非局部变量。
这一变化也影响了隐式定位 locals()
的代码执行函数(例如 exec()
和 eval()
)的默认行为。 在以前的版本中,调用代码执行函数后,是否可以通过调用 locals()
访问更改取决于具体的实现。
现在,代码将始终针对优化作用域中局部变量的独立快照运行,因此更改永远不会在后续调用 locals()
时可见。 要访问这些情况下的更改,现在必须向相关函数传递一个显式命名空间引用。
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
。arm-linux-androideabi
和 i686-linux-android
提供尽力而为的支持,但不是 3 级支持平台。__future__
模块的相对导入触发。except
块中允许使用全局声明,只要该全局变量在 else
块中被使用。__static_attributes__
属性,用于存储从类主体中任何函数通过 self.X
访问的属性名称。编译器现在会在类上创建一个 __firstlineno__
属性,其中包含类定义第一行的行号。PythonFinalizationError
异常,当操作在终结过程中被阻塞时抛出。新增 deprecated
参数到 add_argument()
和 add_parser()
方法,用于标记命令行选项、位置参数和子命令为已弃用状态。
w
类型码,用于 Unicode 字符,替代已弃用的 u
类型码。array.array
现在通过实现 clear()
方法注册为 MutableSequence
。ast.parse()
新增 optimize
可选参数,支持获取优化后的 AST。as_completed()
现在返回异步迭代器和普通迭代器。Queue.shutdown
和 QueueShutDown
。TaskGroup
在取消操作时的行为。新增 z85encode()
和 z85decode()
函数,用于 Z85 数据编解码。
新增对未命名段的支持,允许顶级键值对。
新增 replace()
函数和替换协议,简化对象修改副本的创建。
Structure
对象新增 _align_
属性,可显式指定结构体内存对齐方式。
dbm.sqlite3
作为默认 dbm 后端。clear()
方法,用于移除数据库所有项。get_instructions()
不再将缓存条目表示为单独指令。DocTestRunner.run()
现在统计跳过的测试数量。getaddresses()
和 parseaddr()
在遇到无效邮件地址时返回 ('', '')
。Fraction
对象现在支持标准格式规范。
新增 translate()
函数,用于将 shell 风格通配符转换为正则表达式。
多个函数现在支持访问资源目录,不再计划移除。
IOBase
终结器现在会记录 close()
方法产生的错误。
IPv4Address.ipv6_mapped
属性。is_global
和 is_private
的行为。batched()
新增 strict
参数,可在最后一批数量不足时抛出异常。
新增 allow_code
参数控制代码对象序列化。
新增 fma()
函数用于融合乘加运算。
新增 guess_file_type()
函数,用于从文件系统路径猜测 MIME 类型。
seekable()
方法。trackfd
参数,控制文件描述符复制。默认工作线程和进程数现在使用 os.process_cpu_count()
选择。
process_cpu_count()
函数获取可用 CPU 核心数。lchmod()
和 chmod()
的 follow_symlinks
参数。posix_spawn()
现在接受 None
作为 env
参数。UnsupportedOperation
异常。Path
对象的构造函数。full_match()
方法。glob()
和 rglob()
支持递归符号链接。breakpoint()
和 set_trace()
现在立即进入调试器。zipapp
。新增 Queue.shutdown
和 ShutDown
用于队列终止管理。
新增命令行接口。
重命名 re.error
为 PatternError
以提高清晰度。
chown()
支持 dir_fd
和 follow_symlinks
关键字参数。
.pth
文件现在首先尝试用 UTF-8 解码。
Connection
对象未显式关闭时会发出 ResourceWarning
。Connection.iterdump()
新增 filter
参数。create_default_context()
API 现在包含新的默认标志。
kde()
用于核密度估计。kde_random()
用于从估计的概率密度函数采样。在更多情况下使用 posix_spawn()
函数。
新增 _is_interned()
函数测试字符串是否被驻留。
Windows 下 mkdtemp()
默认模式现在限制目录访问。
Windows 下 monotonic()
和 time()
精度提升到微秒级。
Text.count()
支持返回简单整数。PhotoImage
新增多个图像处理方法。exc_type_str
属性。TracebackException.format_exception_only()
新增 show_group
参数。SimpleNamespace
现在可以接受单个位置参数初始化。
ReadOnly
用于标记 TypedDict
项为只读。TypeIs
用于类型检查器类型收窄。NoDefault
作为默认参数哨兵对象。更新 Unicode 数据库到 15.1.0 版本。
新增在虚拟环境目录中创建源代码管理忽略文件的支持。
新增 deprecated()
装饰器用于标记弃用。
iterparse()
返回的迭代器新增 close()
方法。新增对 ZIP64 格式文件的支持。
ssl.create_default_context()
函数现在默认启用 ssl.VERIFY_X509_PARTIAL_CHAIN
和 ssl.VERIFY_X509_STRICT
标志,以提高安全性。os.mkdir()
和 tempfile.mkdtemp()
函数现在支持将 mode
值传递为 0o700
,以对新目录应用访问控制,缓解 CVE 2024-4030 漏洞。2to3
工具和 lib2to3
模块。tkinter.tix
模块。locale.resetlocale()
函数。typing.io
和 typing.re
命名空间。PEP 602 (“Python 的年度发布周期”) 已更新,将新版本的完整支持(“错误修复”)期限延长至两年。 这项更新的政策意味着:
Python 3.13 带来了一系列新特性和改进,特别是在交互式解释器、错误信息、线程模型和 JIT 编译器方面。 这些改进旨在提高 Python 的性能、用户友好性和安全性。 想要了解更多细节,请参阅官方文档和相关的 PEP 文档。