Python 3.10

Python 3.10.0(正式版)于 2021 年 10 月 4 日发布。3.10 的特性定义在 PEP 619 中,对各项变更的详细说明可参见 What's New in Python 3.10

新增语法特性

状态

PEP 634

结构化模式匹配:规范

[1]

PEP 635

结构化模式匹配:动机与原理

[1]

PEP 636

结构化模式匹配:教程

[1]

bpo-12782

现在正式允许使用带括号的上下文管理器

标准库中的新特性

PEP 618

为 zip 添加可选的长度检查

解释器改进

PEP 626

为调试及其他工具提供精确的行号

新增类型标注特性

PEP 604

允许以 X | Y 的形式书写联合类型

PEP 613

显式类型别名

PEP 612

参数规格变量

重要的弃用、移除或限制

PEP 644

要求 OpenSSL 1.1.1 或更新版本

PEP 632

弃用 distutils 模块。

不相关

PEP 623

弃用 PyUnicodeObject 中的 wstr 成员并为其移除做准备。

不相关

PEP 624

移除 Py_UNICODE 编码器 API

不相关

PEP 597

添加可选的 EncodingWarning

其他语言变更:

int 类型新增了 int.bit_count() 方法,用于返回给定整数二进制展开中 1 的个数,也称为位计数(population count)。

dict.keys()dict.values()dict.items() 返回的视图现在都具有 mapping 属性,该属性会给出一个包装了原始字典的 types.MappingProxyType 对象。

PEP 618zip() 函数现在新增了可选的 strict 标志,用于要求所有可迭代对象具有相同的长度。

接受整数参数的内置函数和扩展函数不再接受 DecimalFraction以及其他只能有损转换为整数的对象(例如那些具有 __int__() 方法但没有 __index__() 方法的对象)。

如果 object.__ipow__() 返回 NotImplemented,运算符现在会按预期正确地回退到 object.__pow__()object.__rpow__()

赋值表达式现在可以不加括号地用于集合字面量和集合推导式中,以及序列索引中(但不能用于切片)。

函数新增了 __builtins__ 属性,在函数执行时会用它来查找内置符号,而不再查找 __globals__['__builtins__']。如果 __globals__["__builtins__"] 存在,则该属性据此初始化,否则据当前的内置符号初始化。

新增了两个内置函数 —— aiter()anext(),分别用于为 iter()next() 提供异步对应版本。

静态方法(@staticmethod)和类方法(@classmethod)现在会继承方法属性(__module____name____qualname____doc____annotations__),并新增了 __wrapped__ 属性。此外,静态方法现在可以作为普通函数调用。

在使用 from __future__ import annotations 的情况下,针对复杂目标的标注(即除 PEP 526 所定义的 simple name 目标之外的一切目标)不再产生任何运行时影响。

类对象和模块对象现在会按需惰性地创建空的标注字典。为保持向后兼容,标注字典存储在对象的 __dict__ 中。这改进了使用 __annotations__ 的最佳实践。

由于存在副作用,在使用 from __future__ import annotations 时,现在禁止标注中包含 yieldyield fromawait 或具名表达式。

在使用 from __future__ import annotations 时,标注中对未绑定变量、super() 以及其他可能改变符号表处理过程的表达式的使用现在不再产生任何效果。

float 类型和 decimal.Decimal 类型的 NaN 值的哈希值现在取决于对象标识。此前,尽管各个 NaN 值彼此并不相等,它们的哈希值却始终为 0。这会在创建包含多个 NaN 的字典和集合时因过多的哈希冲突而导致潜在的二次方级运行时行为。

删除 __debug__ 常量时现在会引发 SyntaxError(而非 NameError)。

SyntaxError 异常现在具有 end_linenoend_offset 属性。如果无法确定,它们将为 None

对内置模块的变更:

asyncio

添加了缺失的 connect_accepted_socket() 方法。

array

array.arrayindex() 方法现在新增了可选的 startstop 参数。

gc

gc.get_objects()gc.get_referrers()gc.get_referents() 添加了审计钩子。

hashlib

hashlib 模块要求 OpenSSL 1.1.1 或更新版本。

hashlib 模块对 OpenSSL 3.0.0 提供了初步支持。

pbkdf2_hmac() 的纯 Python 回退实现已被弃用。今后,PBKDF2-HMAC 将仅在 Python 构建时启用了 OpenSSL 支持的情况下可用。

os

为 VxWorks RTOS 添加了 os.cpu_count() 支持。

新增了 os.eventfd() 函数及相关辅助函数,用于封装 Linux 上的 eventfd2 系统调用。

新增了 os.splice(),它允许在两个文件描述符之间移动数据而无需在内核地址空间和用户地址空间之间复制,其中一个文件描述符必须指向管道。

为 macOS 添加了 O_EVTONLYO_FSYNCO_SYMLINKO_NOFOLLOW_ANY

platform

新增了 platform.freedesktop_os_release(),用于从 freedesktop.org os-release 标准文件中获取操作系统标识信息。

socket

异常 socket.timeout 现在是 TimeoutError 的别名。

添加了使用 IPPROTO_MPTCP 创建 MPTCP 套接字的选项。

添加了 IP_RECVTOS 选项,用于接收服务类型(ToS)或 DSCP/ECN 字段。

ssl

ssl 模块要求 OpenSSL 1.1.1 或更新版本。

ssl 模块对 OpenSSL 3.0.0 提供了初步支持,并新增了 OP_IGNORE_UNEXPECTED_EOF 选项。

使用已弃用的函数和已弃用的常量现在会导致 DeprecationWarningssl.SSLContext.options 默认设置了 OP_NO_SSLv2OP_NO_SSLv3,因此无法就再次设置该标志发出警告。

ssl 模块现在具有更安全的默认设置。默认禁用不具备前向保密性或使用 SHA-1 MAC 的加密套件。安全级别 2 禁止使用安全强度低于 112 位的弱 RSA、DH 和 ECC 密钥。SSLContext 默认使用最低协议版本 TLS 1.2。这些设置基于 Hynek Schlawack 的研究。

已弃用的协议 SSL 3.0、TLS 1.0 和 TLS 1.1 不再受到官方支持。Python 并不会主动阻止它们。然而,OpenSSL 的构建选项、发行版配置、厂商补丁以及加密套件可能会导致握手无法成功。

ssl.get_server_certificate() 函数添加了 timeout 参数。

ssl 模块现在使用堆类型和多阶段初始化。

新增了验证标志 VERIFY_X509_PARTIAL_CHAIN

sys

新增了 sys.orig_argv 属性:传递给 Python 可执行文件的原始命令行参数列表。

新增了 sys.stdlib_module_names,其中包含标准库模块名称的列表。

_thread

_thread.interrupt_main() 现在接受一个可选的信号编号以进行模拟(默认仍为 signal.SIGINT)。

注释