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