摘要 - 发布重点
新的语法特性:
PEP 584,为 dict 增加合并运算符;
PEP 585,标准多项集中的类型标注泛型。
PEP 614,放宽对装饰器的语法限制。
新的内置特性:
PEP 616,移除前缀和后缀的字符串方法。
标准库中的新特性:
PEP 593,灵活的函数和变量标注;
添加了
os.pidfd_open()
以允许不带竞争和信号的进程管理。
解释器的改进:
PEP 573,从 C 扩展类型的方法快速访问模块状态;
PEP 617,CPython 现在使用基于 PEG 的新解析器;
许多 Python 内置类型(range, tuple, set, frozenset, list, dict)现在通过使用 PEP 590 vectorcall 获得了加速;
垃圾回收不会因恢复的对象而阻塞;
许多 Python 模块 (
_abc
,audioop
,_bz2
,_codecs
,_contextvars
,_crypt
,_functools
,_json
,_locale
,math
,operator
,resource
,time
,_weakref
) 现在会使用 PEP 489 所定义的多阶段初始化;许多标准库模块 (
audioop
,ast
,grp
,_hashlib
,pwd
,_posixsubprocess
,random
,select
,struct
,termios
,zlib
) 现在会使用 PEP 384 所定义的稳定 ABI。
新的库模块:
PEP 615,IANA 时区数据库现在已包含于标准库的
zoneinfo
模块;图的拓扑排序实现现在已由新的
graphlib
模块提供。
发布进程的变化:
PEP 602,CPython 采用年度发布周期
新的特性
1. 字典合并与更新运算符
合并 (|) 与更新 (|=) 运算符已被加入内置的 dict 类。
它们为现有的 dict.update 和 {**d1, **d2} 字典合并方法提供了补充。
示例:
>>> x = {"key1": "value1 from x", "key2": "value2 from x"}>>> y = {"key2": "value2 from y", "key3": "value3 from y"}>>> x | y
{'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}>>> y | x
{'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}
新增用于移除前缀和后缀的字符串方法增加了 str.removeprefix(prefix) 和 str.removesuffix(suffix) 用于方便地从字符串移除不需要的前缀或后缀。
也增加了 bytes, bytearray 以及 collections.UserString 的对应方法。
请参阅PEP 616了解详情。(由 Dennis Sweeney 在 bpo-39939 中贡献。)
2. 标准多项集中的类型标注泛型
在类型标注中现在你可以使用内置多项集类型例如 list 和 dict 作为通用类型而不必从 typing 导入对应的大写形式类型名 (例如 List 和 Dict)。标准库中的其他一些类型现在同样也是通用的,例如 queue.Queue。
示例:
def greet_all(names: list[str]) -> None:for name in names:print("Hello", name)
请参阅PEP 585了解详情。(由 Guido van Rossum, Ethan Smith 和 Batuhan Taşkaya 在 bpo-39481 中贡献。)
改进的模块
1. concurrent.futures
将新的 cancel_futures 形参添加到 concurrent.futures.Executor.shutdown(),可以取消尚未开始运行的所有挂起的 Future,而不必等待它们完成运行再关闭执行器。(由 Kyle Stanley 在 bpo-39349 中贡献。)
从 ThreadPoolExecutor 和 ProcessPoolExecutor 中移除了守护线程。这改善与与子解释器的兼容性及它们在关闭进程时的可预测性。(由 Kyle Stanley 在 bpo-39812 中贡献。)
现在 ProcessPoolExecutor 中的工作进程仅会在没有可重用的空闲工作进程时按需产生。这优化了启动开销并减少了由空闲工作进程导致的 CPU 时间损失。(由 Kyle Stanley 在 bpo-39207 中贡献。)
2. datetime
datetime.date 的 isocalendar() 以及 datetime.datetime 的 isocalendar() 等方法现在将返回 namedtuple() 而不是 tuple。(由 Dong-hee Na 在 bpo-24416 中贡献。)
3. ipaddress
ipaddress 现在支持 IPv6 作用域地址(即带有 % 前缀的 IPv6 地址)。
IPv6 作用域地址可使用 ipaddress.IPv6Address 来解析。作用域的区 ID 如果存在,可通过 scope_id 属性来获取。(由 Oleksandr Pavliuk 在 bpo-34788 中贡献。)
4. multiprocessing
multiprocessing.SimpleQueue 类新增了 close() 方法用来显式地关闭队列。(由 Victor Stinner 在 bpo-30966 中贡献。)
5. pprint
现在 pprint 能美化打印 types.SimpleNamespace。(由 Carl Bordum Hansen 在 bpo-37376 中贡献。)
6. random
增加了新的 random.Random.randbytes 方法:生成随机字节串。(由 Victor Stinner 在 bpo-40286 中贡献。)
7. smtplib
现在 SMTP 和 SMTP_SSL 当它们的构造器所给定的超时参数为零以防止创建非阻塞套接字时会引发 ValueError。(由 Dong-hee Na 在 bpo-39259 中贡献。)
现在 LMTP
构造器具有可选的 timeout 形参。(由 Dong-hee Na 在 bpo-39329 中贡献。)
8. socket
socket 模块现在会在 Linux 4.1 或更高版本上导出 CAN_RAW_JOIN_FILTERS 常量。(由 Stefan Tatschner 和 Zackery Spytz 在 bpo-25780 中贡献。)
现在 socket 模块会在支持的平台上支持 CAN_J1939
协议。(由 Karl Ding 在 bpo-40291 上贡献。)
现在 socket 模块具有 socket.send_fds() 和 socket.recv.fds() 方法。(由 Joannah Nanjekye, Shinya Okano 和 Victor Stinner 在 bpo-28724 中贡献。)
9. time
在 AIX 上,现在 thread_time() 是使用具有纳秒级精度的 thread_cputime() 实现,而不再是只有 10 毫秒精度的 clock_gettime(CLOCK_THREAD_CPUTIME_ID)。
(由 Batuhan Taskaya 在 bpo-40192 中贡献。)
关于Python3.9的新特性就分享到这里了,更多内容,请前往官网查阅!
从以上信息看来,Python3.9改进还是比较多的,如果大家有兴趣的话,不妨尝试一下字典和改进的模块哟。
下一课分享:Python分支和循环。
往期回顾 ·
自动化运维实战五 | 【演示】3分钟一键部署Mysql数据库
自动化运维实战四 | 【实现】Mysql一键部署的前后端交互
自动化运维实战三 | 【规划】Mysql一键部署的数据模型
自动化运维实战二 | 【构思】Mysql一键部署的界面
自动化运维实战一 | 【模板】 套用精美模板演示登陆界面
喜欢就点个 在看 呀!