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

添加可选的编码警告

其他语言变化:

int 类型有一个新方法 int.bit_count() ,返回给定整数的二进制展开形式中的1个数,也称为总体计数。

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

PEP 618: 现在, zip() 函数具有一个可选的 strict 标志,用于要求所有可迭代对象具有相等的长度。

采用整数参数的内置函数和扩展函数不再接受 Decimals、 Fractions 以及其他只能带有损失地转换为整数的对象(例如,具有 __int__() 方法但没有 __index__() 方法的对象)。

如果 object.__ipow__() 返回 NotImplemented ,操作符将正确回退到 object.__pow__()object.__rpow__() 如预期的那样。

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

函数有一个新的 __builtins__ 属性,用于在函数执行时查找内置符号,而不是查找 __globals__['__builtins__']。该属性从 __globals__["__builtins__"] 初始化,如果存在,否则从当前的builtins初始化。

增加了两个新的内置函数 – aiter()anext() ,分别为 iter()next() 提供异步对应。

静态方法(@staticmethod)和类方法(@classmethod)现在继承方法属性(__module____name____qualname____doc____annotations__),并有一个新的 __wrapped__ 属性。此外,静态方法现在可以像普通函数一样调用。

复杂目标的注释(除了由:pep:526 定义的 simple name 目标之外的所有内容)不再导致 from __future__ import annotations 的运行时影响。

类和模块对象现在可以根据需要惰性创建空注释字典。为了向后兼容,注释字典存储在对象的 __dict__ 中。这改进了使用 __annotations__ 的最佳实践。

yieldyield fromawait 或命名表达式组成的注释现在被禁止在 from __future__ import annotations 下,因为它们的副作用。

未绑定变量、super() 和其他表达式的使用可能会改变符号表的处理,因为注释现在在 from __future__ import annotations 下变为无效。

float 类型和 decimal.Decimal 类型的NaN值的哈希值现在取决于对象标识。以前,它们总是散列到 0 ,即使NaN值彼此不相等。这导致在创建包含多个nan的字典和集合时,由于哈希冲突过多,这可能导致二次运行时行为。

删除 __debug__ 常量时,将引发一个 SyntaxError (而不是 NameError)。

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

对内置模块的更改:

asyncio

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

array

array.arrayindex() 方法现在具有可选的 start*和 *stop 参数。

gc

为以下项添加审核挂钩 gc.get_objects()gc.get_referrers()gc.get_referents()

hashlib

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

hashlib模块对OpenSSL 3.0.0有初步支持。

不赞成使用纯Python回退 pbkdf2_hmac() 。在未来,PBKDF2-HMAC将仅在Python已构建并支持OpenSSL时可用。

os

添加 os.cpu_count() 对 VxWorks RTOS的支持。

添加一个新函数 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)。

笔记