摘要–发布要点
新语法功能:
PEP 584,加入工会运营商dict;
PEP 585,标准集合中的类型提示泛型;
PEP 614,放宽了对装饰器的语法限制。
新的内置功能:
PEP 616,用于删除前缀和后缀的字符串方法。
标准库中的新功能:
PEP 593,灵活的功能和变量注释;
os.pidfd_open() 添加了允许进行过程管理而没有种族和信号的情况。
口译员的改进:
PEP 573,从C扩展类型的方法快速访问模块状态;
PEP 617,CPython现在使用基于PEG的新解析器;
现在,使用以下命令加速了许多Python内置函数(范围,元组,集合,frozenset,列表,字典) PEP 590矢量通话;
垃圾回收不会阻止复活的对象;
许多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)现在正在使用的稳定ABI通过PEP 384限定。
新的库模块:
PEP 615现在是IANA时区数据库存在于zoneinfo模块的标准库中;
现在在新graphlib模块中提供了图的拓扑排序的实现。
发布过程更改:
PEP 602,CPython采用年度发布周期。
您应该检查你的代码DeprecationWarning
当仍支持Python 2.7时,为了保留与Python 2.7的向后兼容性,Python 3保留了许多功能。随着Python 2支持的结束,这些向后兼容层已被删除,或者将很快被删除。他们中的大多数人发出了DeprecationWarning几年警告。例如,使用collections.Mapping而不是 collections.abc.Mapping发出DeprecationWarning自2012年发布的Python 3.3。
使用命令行选项测试您的应用程序以查看 和,甚至 将它们视为错误。警告过滤器可用于忽略来自第三方代码的警告。-W defaultDeprecationWarningPendingDeprecationWarning-W error
Python 3.9是提供这些Python 2向后兼容性层的最新版本,以便给Python项目维护者更多的时间来组织对Python 2支持的取消和对Python 3.9的支持。
模块中对抽象基类的别名collections(如的collections.Mapping别名) collections.abc.Mapping保留为最新版本,以实现向后兼容。它们将从Python 3.10中删除。
通常,尝试在Python开发模式下运行测试,这有助于准备代码以使其与下一Python版本兼容。
注意:在此版本的Python中,也删除了许多先前存在的弃用项。请参阅“已删除”部分。
新功能
字典合并和更新运算符
Merge(|)和update(|=)运算符已添加到内置 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'}
看到 有关完整说明,请参见PEP 584。(由Brandt Bucher在bpo-36144中贡献。)
删除前缀和后缀的新字符串方法
str.removeprefix(prefix)并且 str.removesuffix(suffix)已添加,可以轻松地从字符串中删除不需要的前缀或后缀。相应的 bytes,bytearray和collections.UserString方法也已添加。看到有关完整说明,请参见PEP 616。(由Dennis Sweeney在 bpo-39939中贡献。)
类型提示泛型雅集
在类型注释中,您现在可以使用内置的集合类型,例如 list和dict作为通用类型,而不是从中导入相应的大写类型(例如List或Dict) typing。例如,标准库中的其他一些类型现在也通用了queue.Queue。
例:
def greet_all(names: list[str]) -> None:
for name in names:
print("Hello", name)
看到 PEP 585了解更多详情。(由Guido van Rossum,Ethan Smith和BatuhanTaşkaya在bpo-39481中贡献。)
新的解析器
Python 3.9使用了一个新的解析器,该解析器基于PEG而不是LL(1)。新解析器的性能大致可与旧解析器媲美,但是在设计新语言功能时,PEG形式主义比LL(1)更灵活。我们将在Python 3.10及更高版本中开始使用这种灵活性。
该ast模块使用新的解析器,并产生与旧解析器相同的AST。
在Python 3.10中,旧的解析器将被删除,依赖它的所有功能也将被删除(主要是parser早已弃用的模块)。仅在Python 3.9中,您可以使用命令行开关()或环境变量()切换回LL(1)解析器。-X oldparserPYTHONOLDPARSER=1
看到 PEP 617了解更多详情。(由Guido van Rossum,Pablo Galindo和Lysandros Nikolaou在bpo-40334中贡献。)
其他语言的变化
__import__()现在提高,ImportError而不是 ValueError,通常是在相对导入超出其顶级包时发生。(由Ngalim Siregar在bpo-37444中贡献。)
Python现在获取在命令行(例如:)上指定的脚本文件名的绝对路径:模块的属性变为绝对路径,而不是相对路径。现在,通过更改当前目录后,这些路径仍然有效。副作用是,在这种情况下,回溯还会显示模块框架的绝对路径。(由Victor Stinner在bpo-20443中贡献。)python3 script.py__file____main__os.chdir()__main__
现在,在Python开发模式和调试版本中,将 检查encoding和errors参数是否进行了字符串编码和解码操作。例如:open(),str.encode()和 bytes.decode()。
默认情况下,为了获得最佳性能,仅在出现第一个编码/解码错误时才检查errors参数,并且对于空字符串有时会忽略encoding参数。(由Victor Stinner在bpo-37388中贡献。)
"".replace("", s, n)现在返回s所有非零值,而不是空字符串n。现在与保持一致。和对象也有类似的变化。(由Serhiy Storchaka在bpo-28029中贡献。)"".replace("", s)bytesbytearray
任何有效的表达式现在都可以用作装饰器。以前,语法的限制要多得多。看到详情请参阅PEP 614。(由Brandt Bucher在bpo-39702中贡献。)
改进了对typing模块的帮助。现在将显示所有特殊格式和特殊通用别名(如Union和List)的文档字符串。使用help()与一般的别名一样List[int]会显示对应的具体类型的帮助(list在这种情况下)。(由Serhiy Storchaka在bpo-40257中贡献。)
平行运行aclose()/ asend()/ athrow()现在禁止,而ag_running现在反映异步发电机的实际运行状态。(由Yury Selivanov在bpo-30773中贡献。)
在调用意外的错误__iter__方法不再掩盖 TypeError在in操作和功能 contains(),indexOf()以及 countOf()在的operator模块。(由Serhiy Storchaka在bpo-40824中贡献。)
新模块
区信息
该zoneinfo模块将对IANA时区数据库的支持引入标准库。它添加zoneinfo.ZoneInfo了datetime.tzinfo以系统时区数据为后盾的具体 实现。
例:
>>>
>>> from zoneinfo import ZoneInfo
>>> from datetime import datetime, timedelta
>>> # Daylight saving time
>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(dt)
2020-10-31 12:00:00-07:00
>>> dt.tzname()
'PDT'
>>> # Standard time
>>> dt += timedelta(days=7)
>>> print(dt)
2020-11-07 12:00:00-08:00
>>> print(dt.tzname())
PST
作为未提供IANA数据库的平台的备用数据源,该tzdata模块以第一方包的形式发布-通过PyPI分发并由CPython核心团队维护。
也可以看看
PEP 615 –支持标准库中的IANA时区数据库
PEP由Paul Ganssle编写并实施
graphlib
添加了一个新模块,该模块graphlib包含graphlib.TopologicalSorter提供用于执行图形拓扑排序功能的 类。(由Pablo Galindo,Tim Peters和Larry Hastings在bpo-17005中贡献。)
改进模块
AST
添加了缩进选项,以dump()使其产生多行缩进输出。(由Serhiy Storchaka在bpo-37995中贡献。)
ast.unparse()作为ast模块中的函数添加,可用于解析ast.AST对象并生成带有代码的字符串,该代码ast.AST在解析时会生成等效的对象。(由Pablo Galindo和Batuhan Taskaya在bpo-38870中贡献。)
向包含用于构造该节点的ASDL签名的AST节点添加了文档字符串。(由Batuhan Taskaya在bpo-39638中贡献。)
异步
由于重大安全问题,不再支持的reuse_address参数 asyncio.loop.create_datagram_endpoint()。这是由于SO_REUSEADDRUDP中的套接字选项的行为。有关更多详细信息,请参见的文档loop.create_datagram_endpoint()。(由Kyle Stanley,Antoine Pitrou和Yury Selivanov在 bpo-37228中贡献。)
添加了一个新的协程 shutdown_default_executor() ,该协程计划为等待ThreadPoolExecutor结束关闭的默认执行程序安排 关闭时间。另外, asyncio.run()已更新为使用新的协程。(由Kyle Stanley在bpo-34037中贡献。)
添加了asyncio.PidfdChildWatcher,它是Linux专用的子监视程序实现,用于轮询进程文件描述符。(bpo-38692)
添加了新的协程 asyncio.to_thread()。它主要用于在单独的线程中运行IO绑定函数,以避免阻塞事件循环,并且实际上run_in_executor()是可以直接使用关键字参数的高级版本 。(由Kyle Stanley和Yury Selivanov在bpo-32309中贡献。)
asyncio.wait_for()现在,由于超时而取消任务时,即使超时<= 0,现在也要等到取消完成为止,就像正超时一样。(由Elvis Pranskevichus在bpo-32751中贡献。)
asyncio现在TyperError使用ssl.SSLSocket套接字调用不兼容的方法时引发。(由Ido Michael在bpo-37404中贡献。)
编译
增加了对重复.pyc文件使用硬链接的新可能性:hardlink_dupes参数和–hardlink-dupes命令行选项。(由Lumír'Frenzy'Balhar在bpo-40495中贡献。)
在结果.pyc文件中添加了用于路径操作的新选项:stripdir,prependdir,limit_sl_dest参数以及-s,-p和-e命令行选项。添加了多次为优化级别指定选项的可能性。(由Lumír'Frenzy'Balhar在bpo-38112中贡献。)
concurrent.futures
向其添加了一个新的cancel_futures参数,concurrent.futures.Executor.shutdown()该参数将 取消所有尚未开始运行的未决期货,而不是在关闭执行程序之前等待它们完成。(由Kyle Stanley在bpo-39349中贡献。)
从ThreadPoolExecutor 和中删除了守护进程线程ProcessPoolExecutor。这提高了与子解释器的兼容性以及其关闭过程的可预测性。(由Kyle Stanley在bpo-39812中贡献。)
在工人们ProcessPoolExecutor现在正在催生需求,只有当没有可用的空闲工作者的重用。这优化了启动开销,并减少了空闲工作者的CPU时间损失。(由Kyle Stanley在bpo-39207中贡献。)
诅咒
新增curses.get_escdelay(),curses.set_escdelay(), curses.get_tabsize(),和curses.set_tabsize()功能。(由Anthony Sottile在bpo-38312中贡献。)
日期时间
在isocalendar()中datetime.date 和isocalendar()的datetime.datetime 方法,现在返回namedtuple(),而不是一个tuple。(由Dong-hee Na在bpo-24416中贡献。)
distutils的
现在,上载命令将创建SHA2-256和Blake2b-256哈希摘要。它会在阻止MD5摘要的平台上跳过MD5。(由Christian Heimes在bpo-40698中贡献。)
的fcntl
新增的常量F_OFD_GETLK,F_OFD_SETLK 和F_OFD_SETLKW。(由Dong-hee Na在bpo-38602中贡献。)
FTPLIB
FTP而FTP_TLS现在提出一个ValueError 如果他们构造了给定超时为零,以防止非阻塞套接字的创建。(由Dong-hee Na在bpo-39259中贡献。)
GC
当垃圾收集器进行一些对象复活的收集时(在完成终结器之后,可以从隔离的循环外部访问它们),请不要阻止所有仍无法访问的对象的收集。(由Pablo Galindo和Tim Peters在bpo-38379中贡献。)
添加了一个新功能,gc.is_finalized()以检查对象是否已由垃圾收集器完成。(由Pablo Galindo在bpo-39322中贡献 。)
hashlib
该hashlib模块现在可以使用OpenSSL中的SHA3哈希和SHAKE XOF(如果有)。(由Christian Heimes在bpo-37630中贡献。)
内置的哈希模块现在可以通过强制使用基于OpenSSL的实现禁用 或有选择地启用。(由Christian Heimes在bpo-40479中贡献)./configure --without-builtin-hashlib-hashes./configure --with-builtin-hashlib-hashes=sha3,blake2
HTTP
HTTP状态代码,并且已添加到中 。(由Dong-hee Na在bpo-39509和Ross Rhodes在bpo-39507中贡献。)103 EARLY_HINTS418 IM_A_TEAPOT425 TOO_EARLYhttp.HTTPStatus
空闲和idlelib
添加了切换光标闪烁的选项。(由Zackery Spytz在bpo-4603中贡献。)
退出键现在关闭IDLE完成窗口。(由Johnny Najera在bpo-38944中贡献。)
在模块名称完成列表中添加了关键字。(由Terry J.Reedy在bpo-37765中贡献。)
上面的更改已反向移植到3.8维护版本。