Python 3.9

Python 3.9.0(最终版)已于 2020 年 10 月 5 日发布。3.9 的特性定义于 PEP 596,变更的详细说明可在 What's New in Python 3.9 中找到

特性

状态

PEP 573

从 C 扩展类型的方法快速访问模块状态

不相关

PEP 584

为 dict 添加联合运算符

已完成 [1]

PEP 585

标准集合中的类型提示泛型

PEP 593

灵活的函数和变量注解

PEP 602

CPython 采用年度发布周期。但目标并非每年,而是每两个月发布一次

不相关

PEP 614

放宽对装饰器的语法限制

PEP 615

IANA 时区数据库现在以 zoneinfo 模块的形式出现在标准库中

PEP 616

用于移除前缀和后缀的字符串方法

PEP 617

CPython 现在使用基于 PEG 的新解析器

不相关

其他语言变更:

__import__() 现在抛出 ImportError 而非 ValueError

已完成

Python 现在会获取命令行中指定的脚本文件名的绝对路径(例如:python3 script.py):__main__ 模块的 __file__ 属性变为绝对路径,而非相对路径

默认情况下,为获得最佳性能,errors 参数仅在首次编码/解码错误时被检查,并且对于空字符串有时会忽略 encoding 参数

对于所有非零的 n,"".replace("", s, n) 现在返回 s 而非空字符串。这现在与 "".replace("", s) 保持一致

现在任何有效的表达式都可以用作装饰器。此前,其语法限制要严格得多

现在禁止并行运行 aclose() / asend() / athrow(),并且 ag_running 现在反映异步生成器的实际运行状态

调用 __iter__ 方法时发生的意外错误,不再被 in 运算符以及 operator 模块的 contains()、indexOf() 和 countOf() 函数中的 TypeError 所掩盖

未加括号的 lambda 表达式不能再作为推导式和生成器表达式中 if 子句的表达式部分

内置模块的变更:

asyncio

出于重大的安全考虑,asyncio.loop.create_datagram_endpoint() 的 reuse_address 参数不再受支持

新增了协程 shutdown_default_executor(),它为默认执行器调度关闭操作,并等待 ThreadPoolExecutor 完成关闭。此外,asyncio.run() 也已更新为使用这一新协程。

新增了 asyncio.PidfdChildWatcher,这是一种 Linux 专用的子进程监视器实现,它会轮询进程文件描述符

新增了一个新的 coroutine asyncio.to_thread()

当因超时而取消任务时,asyncio.wait_for() 现在会等待取消操作完成;在 timeout <= 0 的情况下也是如此,就像超时为正值时一样

当对 ssl.SSLSocket 套接字调用不兼容的方法时,asyncio 现在会抛出 TyperError

gc

垃圾回收不再在被复活的对象上阻塞

新增了函数 gc.is_finalized(),用于检查某个对象是否已被垃圾回收器终结

math

扩展了 math.gcd() 函数以处理多个参数。此前它仅支持两个参数

新增了 math.lcm():返回指定参数的最小公倍数

新增了 math.nextafter():返回 x 朝向 y 方向之后的下一个浮点数值

新增了 math.ulp():返回浮点数最低有效位的值

os

暴露了 Linux 专用的 os.pidfd_open()os.P_PIDFD

os.unsetenv() 函数现在在 Windows 上也可用

已完成

os.putenv()os.unsetenv() 函数现在始终可用

已完成

新增了 os.waitstatus_to_exitcode() 函数:将 wait 状态转换为退出码

random

新增了 random.Random.randbytes 方法:生成随机字节

sys

新增了 sys.platlibdir 属性:平台专用库目录的名称

此前,sys.stderr 在非交互式时采用块缓冲。现在 stderr 默认始终采用行缓冲

注意事项