Python 3.9 有什么新�化¶
- 编者:
�ukasz Langa
è¿™ç¯‡æ–‡ç« ä»‹ç»�了 Python 3.9 相比 3.8 å¢žåŠ çš„æ–°ç‰¹æ€§ã€‚ Python 3.9 å�‘布于 2020å¹´ 10 月 5 日。 更详细的信æ�¯å�¯å�‚阅 更新日志。
��
PEP 596 - Python 3.9 �布计划
摘� -- �布�点¶
æ–°çš„è¯æ³•特性:
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ï¼Œæ ‡å‡†åº“çš„
zoneinfo模�现已支� IANA 时区数�库;图的拓扑排�实现现在已由新的
graphlib模��供。
�布进程的�化:
PEP 602,CPython 采用年度�布周期。
请检查代ç �ä¸çš„ DeprecationWarning。¶
Python 2.7 支æŒ�æœªç»ˆæ¢æ—¶ï¼Œä¸ºäº†å®žçްå�‘下兼容 Python 2.7,Python 3 ä¿�留了许多旧版功能。Python 2 的支æŒ�终æ¢å�Žï¼Œå·²ç»�移除了一部分å�‘ä¸‹å…¼å®¹å±‚ï¼Œå‰©ä½™éƒ¨åˆ†å¾ˆå¿«ä¹Ÿä¼šè¢«ç§»é™¤ã€‚è¿™å‡ å¹´ï¼Œå¤§éƒ¨åˆ†å…¼å®¹å±‚éƒ½ä¼šè§¦å�‘ DeprecationWarning è¦å‘Šã€‚例如,2012 å¹´å�‘布 Python 3.3 å�Žï¼Œç”¨ collections.Mapping 替代 collections.abc.Mapping 就会触å�‘ DeprecationWarning。
请用 -W default 命令行选项测试应用程åº�æ�¥æŸ¥çœ‹ DeprecationWarning å’Œ PendingDeprecationWarning,甚至å�¯ä»¥ç”¨ -W error 将它们视为错误。 å�¯ä»¥ç”¨ è¦å‘Šè¿‡æ»¤å™¨ 忽略æ�¥è‡ªç¬¬ä¸‰æ–¹ä»£ç �çš„è¦å‘Šã€‚
Python 3.9 是最å�Žä¸€ä¸ªæ��ä¾› Python 2 å�‘下兼容层的版本,以给予 Python 项目维护者更多时间移除 Python 2 支æŒ�ï¼Œæ·»åŠ Python 3.9 支æŒ�。
collections 模å�—ä¸ æŠ½è±¡åŸºç±» 的别å��,例如 collections.abc.Mapping 的别å�� collections.Mapping 会为å�‘下兼容最å�Žä¿�留一个å�‘行版。 这些内容将在 Python 3.10 ä¸ç§»é™¤ã€‚
更通俗的说法是,请在 Python å¼€å�‘模å¼� 下è¿�è¡Œæµ‹è¯•ï¼Œè¿™æ ·å�šæœ‰åŠ©äºŽè®©ä»£ç �兼容 Python çš„å�Žç»ç‰ˆæœ¬ã€‚
注:一些å‰�æœŸå·²å¼ƒç”¨çš„å†…å®¹ä¹Ÿå°†åœ¨æ¤ Python 版本ä¸ç§»é™¤ã€‚ 详è§� 移除 一节。
新的特性¶
å—å…¸å�ˆå¹¶ä¸Žæ›´æ–°è¿�算符¶
å�ˆå¹¶ (|) 与更新 (|=) è¿�ç®—ç¬¦å·²è¢«åŠ å…¥å†…ç½®çš„ 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 作为通用类型而ä¸�必从 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 ä¸è´¡çŒ®ã€‚)
新的解�器¶
Python 3.9 使用于基于 PEG 的新解æž�器替代 LL(1)。 æ–°è§£æž�器的性能与旧解æž�器大致相当,但 PEG 在设计新è¯è¨€ç‰¹æ€§æ—¶çš„å½¢å¼�化比 LL(1) æ›´ç�µæ´»ã€‚ 我们将在 Python 3.10 å�Šä¹‹å�Žç‰ˆæœ¬ä¸å¼€å§‹ä½¿ç”¨è¿™ç§�ç�µæ´»æ€§ã€‚
ast 模�会使用新解�器并会生�与旧解�器一致的 AST。
在 Python 3.10 ä¸ï¼Œæ—§è§£æž�器将被移除,ä¾�赖于它的所有功能也将被移除(主è¦�是 parser 模å�—,它早已被弃用)。 å�ªæœ‰ 在 Python 3.9 ä¸ï¼Œä½ å�¯ä»¥ä½¿ç”¨å‘½ä»¤è¡Œå¼€å…³ (-X oldparser) 或环境å�˜é‡� (PYTHONOLDPARSER=1) 切æ�¢å›ž LL(1) è§£æž�器。
请å�‚阅 PEP 617 了解详情。 (由 Guido van Rossum, Pablo Galindo å’Œ Lysandros Nikolaou 在 bpo-40334 ä¸è´¡çŒ®ã€‚)
å…¶ä»–è¯è¨€ç‰¹æ€§ä¿®æ”¹Â¶
__import__()现在会引å�‘ImportError而ä¸�是ValueError,å�Žè€…曾ç»�会在相对导入超出其最高层级包时å�‘生。 (由 Ngalim Siregar 在 bpo-37444 ä¸è´¡çŒ®ã€‚)Python 现在会获å�–å‘½ä»¤è¡Œä¸æŒ‡å®šçš„脚本文件å�� (例如:
python3 script.py) çš„ç»�对路径:__main__模å�—çš„__file__属性将是一个ç»�对路径,而ä¸�是相对路径。 现在æ¤è·¯å¾„在当å‰�目录通过os.chdir()被改å�˜å�Žä»�å°†ä¿�æŒ�有效。 作为附带效果,回溯信æ�¯ä¹Ÿå°†åœ¨æ¤æƒ…况下为__main__模å�—帧显示ç»�对路径。 (由 Victor Stinner 在 bpo-20443 ä¸è´¡çŒ®ã€‚)在 Python å¼€å�‘模å¼� 以å�Š è°ƒè¯•ç¼–è¯‘ç‰ˆæœ¬ ä¸ï¼ŒçŽ°åœ¨ä¼šé’ˆå¯¹å—符串编ç �和解ç �æ“�作检查 encoding å’Œ errors å�‚数。 例如:
open(),str.encode()å’Œbytes.decode()。默认设置下,为ä¿�è¯�性能,errors å�‚æ•°å�ªä¼šåœ¨ç¬¬ä¸€æ¬¡å�‘生编ç �/è§£ç �错误时被检查,并且对于空å—符串 encoding å�‚数有时会被忽略。 (由 Victor Stinner 在 bpo-37388 ä¸è´¡çŒ®ã€‚)
"".replace("", s, n)对于所有é�žé›¶çš„n都将返回s而ä¸�是空å—符串。 çŽ°åœ¨æ¤æ–¹æ³•会与"".replace("", s)ä¿�æŒ�一致。 对于byteså’Œbytearray对象也有类似的修改。 (由 Serhiy Storchaka 在 bpo-28029 ä¸è´¡çŒ®ã€‚)任何有效的表达å¼�现在都å�¯è¢«ç”¨ä½œ decorator。 在之å‰�版本ä¸ï¼Œç›¸å…³è¯æ³•åˆ™æ›´ä¸ºä¸¥æ ¼ã€‚ 请å�‚阅 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__方法时å�‘生的é�žé¢„期错误ä¸�会å†�被inè¿�算符以å�Šoperatorçš„contains(),indexOf()å’ŒcountOf()ä¸çš„TypeError所掩盖。 (由 Serhiy Storchaka 在 bpo-40824 ä¸è´¡çŒ®ã€‚ï¼‰æœªåŠ åœ†æ‹¬å�·çš„ lambda 表达å¼�ä¸�能å†�作为推导å¼�和生æˆ�器表达å¼�çš„
ifå�å�¥çš„表达å¼�部分。 请å�‚阅 bpo-41848 å’Œ bpo-43755 了解详情。
新增模�¶
zoneinfo¶
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¶
å°† indent é€‰é¡¹æ·»åŠ åˆ° dump(),这å…�许它产生多行缩进的输出。 (由 Serhiy Storchaka 在 bpo-37995 ä¸è´¡çŒ®ã€‚)
æ·»åŠ äº† ast.unparse() 作为 ast 模å�—ä¸çš„一个函数,它å�¯è¢«ç”¨æ�¥å��è§£æž� ast.AST 对象并产生相应的代ç �å—符串,当它被解æž�时将会产生一个ç‰ä»·çš„ ast.AST 对象。 (由 Pablo Galindo å’Œ Batuhan Taskaya 在 bpo-38870 ä¸è´¡çŒ®ã€‚)
为 AST èŠ‚ç‚¹æ·»åŠ äº†æ–‡æ¡£å—符串,其ä¸åŒ…å�« ASDL ç¾å��,å�¯è¢«ç”¨æ�¥æž„é€ å¯¹åº”çš„èŠ‚ç‚¹ã€‚ (由 Batuhan Taskaya 在 bpo-39638 ä¸è´¡çŒ®ã€‚)
asyncio¶
出于é‡�è¦�的安全性考é‡�,asyncio.loop.create_datagram_endpoint() çš„ reuse_address å½¢å�‚ä¸�å†�被支æŒ�。 这是由 UDP ä¸çš„套接å—选项 SO_REUSEADDR 的行为导致的。 更多细节请å�‚阅 loop.create_datagram_endpoint() 的文档。 (由 Kyle Stanley, Antoine Pitrou å’Œ Yury Selivanov 在 bpo-37228 ä¸è´¡çŒ®ã€‚。)
æ·»åŠ äº†æ–°çš„ coroutine shutdown_default_executor(),它å�¯ä¸ºç‰å¾… ThreadPoolExecutor 结æ�Ÿå…³é—çš„é»˜è®¤æ‰§è¡Œå™¨å®‰æŽ’å…³é—æ—¥ç¨‹æ“�作。 æ¤å¤–,asyncio.run() 已被更新以使用新的 coroutine。 (由 Kyle Stanley 在 bpo-34037 ä¸è´¡çŒ®ã€‚)
æ·»åŠ äº† asyncio.PidfdChildWatcher,这是一个 Linux 专属的å�监视器实现,它负责轮询进程的文件æ��述符。 (bpo-38692)
æ·»åŠ äº†æ–°çš„ coroutine asyncio.to_thread()。 它主è¦�被用于在å�•独线程ä¸è¿�行 IO 密集型函数以é�¿å…�阻塞事件循环,实质上就相当于是 run_in_executor() 的高层级版本,å�¯ç›´æŽ¥æŽ¥å�—关键å—å�‚数。 (由 Kyle Stanley å’Œ Yury Selivanov 在 bpo-32309 ä¸è´¡çŒ®ã€‚)
当由于超时而å�–消任务时,asyncio.wait_for() 现在将会ç‰å¾…直到也在 timeout 值 <= 0 的情况下完æˆ�å�–消。 å°±åƒ� timeout å€¼ä¸ºæ£æ•°æ—¶ä¸€æ ·ã€‚ (由 Elvis Pranskevichus 在 bpo-32751 ä¸è´¡çŒ®ã€‚)
当附带 ssl.SSLSocket 套接å—调用ä¸�兼容的方法时 asyncio 现在会引å�‘ TyperError。 (由 Ido Michael 在 bpo-37404 ä¸è´¡çŒ®ã€‚)
compileall¶
为é‡�å¤�çš„ .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(),å�¯ä»¥å�–消尚未开始è¿�行的所有挂起的 Future,而ä¸�å¿…ç‰å¾…它们完æˆ�è¿�行å†�关闿‰§è¡Œå™¨ã€‚ (由 Kyle Stanley 在 bpo-39349 ä¸è´¡çŒ®ã€‚)
从 ThreadPoolExecutor å’Œ ProcessPoolExecutor ä¸ç§»é™¤äº†å®ˆæŠ¤çº¿ç¨‹ã€‚ 这改善与与å�解释器的兼容性å�Šå®ƒä»¬åœ¨å…³é—进程时的å�¯é¢„测性。 (由 Kyle Stanley 在 bpo-39812 ä¸è´¡çŒ®ã€‚)
现在 ProcessPoolExecutor ä¸çš„工作进程仅会在没有å�¯é‡�用的空闲工作进程时按需产生。 这优化了å�¯åЍ开销并å‡�少了由空闲工作进程导致的 CPU æ—¶é—´æ�Ÿå¤±ã€‚ (由 Kyle Stanley 在 bpo-39207 ä¸è´¡çŒ®ã€‚)
curses¶
å¢žåŠ äº† curses.get_escdelay(), curses.set_escdelay(), curses.get_tabsize() 以å�Š curses.set_tabsize() 函数。(由 Anthony Sottile 在 bpo-38312 ä¸è´¡çŒ®ã€‚)
datetime¶
datetime.date çš„ isocalendar() 以å�Š datetime.datetime çš„ isocalendar() ç‰æ–¹æ³•现在将返回 namedtuple() 而ä¸�是 tuple。 (由 Donghee Na 在 bpo-24416 ä¸è´¡çŒ®ã€‚)
distutils¶
upload 命令现在会创建 SHA2-256 å’Œ Blake2b-256 哈希摘è¦�。 它会在ç¦�用 MD5 摘è¦�的平å�°ä¸Šè·³è¿‡ MD5。 (由 Christian Heimes 在 bpo-40698 ä¸è´¡çŒ®ã€‚)
fcntl¶
å¢žåŠ äº† F_OFD_GETLK, F_OFD_SETLK å’Œ F_OFD_SETLKW ç‰å¸¸é‡�。 (由 Donghee Na 在 bpo-38602 ä¸è´¡çŒ®ã€‚)
ftplib¶
现在 FTP å’Œ FTP_TLS å½“å®ƒä»¬çš„æž„é€ å™¨æ‰€ç»™å®šçš„è¶…æ—¶å�‚数为零以防æ¢åˆ›å»ºé�žé˜»å¡žå¥—æŽ¥å—æ—¶ä¼šå¼•å�‘ ValueError。 (由 Donghee 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 ä¸è´¡çŒ®ã€‚)
内置的哈希模å�—现在å�¯é€šè¿‡ ./configure --without-builtin-hashlib-hashes ç¦�用或通过 ./configure --with-builtin-hashlib-hashes=sha3,blake2 è¿™æ ·çš„å½¢å¼�有选择地å�¯ç”¨ä»¥å¼ºåˆ¶ä½¿ç”¨åŸºäºŽ OpenSSL 的实现。 (由 Christian Heimes 在 bpo-40479 ä¸è´¡çŒ®ï¼‰
http¶
æ·»åŠ HTTP 状æ€�ç � 103 EARLY_HINTS, 418 IM_A_TEAPOT å’Œ 425 TOO_EARLY 到 http.HTTPStatus。 (由 Donghee Na 在 bpo-39509 以å�Š Ross Rhodes 在 bpo-39507 ä¸è´¡çŒ®ã€‚)
IDLE 与 idlelib¶
æ·»åŠ äº†åˆ‡æ�¢å…‰æ ‡é—ªçƒ�å�œæ¢çš„选项。 (由 Zackery Spytz 在 bpo-4603 ä¸è´¡çŒ®ã€‚)
Esc é”®çŽ°åœ¨ä¼šå…³é— IDLE 补全æ��示窗å�£ã€‚ (由 Johnny Najera 在 bpo-38944 ä¸è´¡çŒ®ã€‚)
æ·»åŠ å…³é”®å—到模å�—å��称补全列表。 (由 Terry J. Reedy 在 bpo-37765 ä¸è´¡çŒ®ã€‚)
3.9 维护版本ä¸çš„æ–°å†…容
使 IDLE 调用 sys.excepthook() (当å�¯åŠ¨æ—¶æ²¡æœ‰ '-n' )。用户钩å�以å‰�是被忽略的。 (ç”± Ken Hilton 在 bpo-43008 ä¸è´¡çŒ®ã€‚)
上述修改已被å��å�‘ç§»æ¤�到 3.8 维护å�‘行版ä¸ã€‚
é‡�新安排设置对è¯�框。 将常规选项å�¡åˆ†æˆ� Windows å’Œ Shell/Ed 选项å�¡ã€‚ 将扩展帮助è�œå�•的帮助æº�ç§»è‡³æ‰©å±•æ ‡ç¾ã€‚为新选项留出空间,并缩çŸå¯¹è¯�框。å�Žè€…使对è¯�框更适å�ˆå°�å±�幕。 (ç”± Terry Jan Reedy 贡献于 bpo-40468 。) 将缩进空间设置从å—ä½“æ ‡ç¾ç§»åˆ°æ–°çš„ Windows æ ‡ç¾ã€‚ (ç”± Mark Roseman å’Œ Terry Jan Reedy 在 bpo-33962 䏿��ä¾›)。
对 .pyi æ–‡ä»¶åº”ç”¨è¯æ³•高亮。 (由 Alex Waygood å’Œ Terry Jan Reedy 在 bpo-45447 ä¸è´¡çŒ®ã€‚)
imaplib¶
现在 IMAP4 å’Œ IMAP4_SSL çš„æž„é€ å™¨å…·æœ‰å�¯é€‰çš„ timeout å½¢å�‚。 并且,现在 open() 方法也具有å�¯é€‰çš„ timeout å½¢å�‚包å�«æ¤ä¿®æ”¹ã€‚ IMAP4_SSL å’Œ IMAP4_stream ä¸è¢«é‡�载的方法也应用了æ¤ä¿®æ”¹ã€‚ (由 Donghee Na 在 bpo-38615 ä¸è´¡çŒ®ã€‚)
å¢žåŠ äº† imaplib.IMAP4.unselect()。 imaplib.IMAP4.unselect() 会释放关è�”到选定邮箱的æœ�务器资æº�å¹¶å°†æœ�务器返回到已认è¯�状æ€�。 æ¤å‘½ä»¤ä¼šæ‰§è¡Œä¸Ž imaplib.IMAP4.close() 相å�Œçš„动作,区别在于它ä¸�会从当å‰�é€‰å®šé‚®ç®±ä¸æ°¸ä¹…地移除消æ�¯ã€‚ (由 Donghee Na 在 bpo-40375 ä¸è´¡çŒ®ã€‚)
importlib¶
为æ��å�‡ä¸Ž import è¯å�¥çš„一致性,现在 importlib.util.resolve_name() å¯¹äºŽæ— æ•ˆçš„ç›¸å¯¹å¯¼å…¥å°�试会引å�‘ ImportError 而ä¸�是 ValueError。 (由 Ngalim Siregar 在 bpo-37444 ä¸è´¡çŒ®ã€‚)
å�‘布ä¸�å�¯å�˜æ¨¡å�—å¯¹è±¡çš„å¯¼å…¥åŠ è½½å™¨é™¤äº†å�‘布å�•独模å�—以外现在也å�¯ä»¥å�‘布ä¸�å�¯å�˜åŒ…。 (由 Dino Viehland 在 bpo-39336 ä¸è´¡çŒ®ã€‚)
æ·»åŠ äº†å¸¦æœ‰å¯¹åŒ…æ•°æ�®ä¸å�目录支æŒ�çš„ importlib.resources.files() 函数,与 importlib_resources 1.5 版的å��å�‘端å�£ç›¸åŒ¹é…�。(由 Jason R. Coombs 在 bpo-39791 ä¸è´¡çŒ®ã€‚)
�自 importlib_metadata 1.6.1 版的已更新 importlib.metadata。
inspect¶
inspect.BoundArguments.arguments 已从 OrderedDict 改为常规å—典。 (由 Inada Naoki 在 bpo-36350 å’Œ bpo-39775 ä¸è´¡çŒ®ã€‚)
ipaddress¶
ipaddress 现在支� IPv6 作用域地�(�带有 %<scope_id> �缀的 IPv6 地�)。
IPv6 作用域地å�€å�¯ä½¿ç”¨ ipaddress.IPv6Address æ�¥è§£æž�。 作用域的区 ID 如果å˜åœ¨ï¼Œå�¯é€šè¿‡ scope_id 属性æ�¥èŽ·å�–。 (由 Oleksandr Pavliuk 在 bpo-34788 ä¸è´¡çŒ®ã€‚)
从 Python 3.9.5 开始 ipaddress 模å�—ä¸�å†�接å�— IPv4 地å�€å—ç¬¦ä¸²ä¸æœ‰ä»»ä½•å‰�缀的零。 (由 Christian Heimes 在 bpo-36384 ä¸è´¡çŒ®ã€‚)
math¶
对 math.gcd() 函数进行了扩展以处ç�†å¤šä¸ªå�‚数。 在之å‰�版本ä¸ï¼Œå®ƒå�ªæ”¯æŒ�两个å�‚数。 (由 Serhiy Storchaka 在 bpo-39648 ä¸è´¡çŒ®ã€‚)
å¢žåŠ äº† math.lcm(): 返回指定å�‚数的最å°�å…¬å€�数。 (由 Mark Dickinson, Ananthakrishnan å’Œ Serhiy Storchaka 在 bpo-39479 å’Œ bpo-39648 ä¸è´¡çŒ®ã€‚)
å¢žåŠ äº† math.nextafter(): 返回从 x å¾€ y æ–¹å�‘的下一个浮点数值。 (由 Victor Stinner 在 bpo-39288 ä¸è´¡çŒ®ã€‚)
å¢žåŠ äº† math.ulp(): 返回一个浮点数的最å°�有效比特ä½�。 (由 Victor Stinner 在 bpo-39310 ä¸è´¡çŒ®ã€‚)
multiprocessing¶
multiprocessing.SimpleQueue 类新增了 close() 方法用æ�¥æ˜¾å¼�地关é—队列。 (由 Victor Stinner 在 bpo-30966 ä¸è´¡çŒ®ã€‚)
nntplib¶
现在 NNTP å’Œ NNTP_SSL å½“å®ƒä»¬çš„æž„é€ å™¨æ‰€ç»™å®šçš„è¶…æ—¶å�‚数为零以防æ¢åˆ›å»ºé�žé˜»å¡žå¥—æŽ¥å—æ—¶ä¼šå¼•å�‘ ValueError。 (由 Donghee Na 在 bpo-39259 ä¸è´¡çŒ®ã€‚)
os¶
å¢žåŠ äº† CLD_KILLED å’Œ CLD_STOPPED 作为 si_code。 (由 Donghee Na 在 bpo-38493 ä¸è´¡çŒ®ã€‚)
对外公开了 Linux 专属的 os.pidfd_open() (bpo-38692) 和 os.P_PIDFD (bpo-38713) 用于文件�述符的进程管�。
现在 os.unsetenv() 函数在 Windows 上也已å�¯ç”¨ã€‚ (由 Victor Stinner 在 bpo-39413 ä¸è´¡çŒ®ã€‚)
现在 os.putenv() å’Œ os.unsetenv() 函数将总是å�¯ç”¨ã€‚ (由 Victor Stinner 在 bpo-39395 ä¸è´¡çŒ®ã€‚)
å¢žåŠ äº† os.waitstatus_to_exitcode() 函数:将ç‰å¾…状æ€�转æ�¢ä¸ºé€€å‡ºç �。 (由 Victor Stinner 在 bpo-40094 ä¸è´¡çŒ®ã€‚)
pathlib¶
å¢žåŠ äº† pathlib.Path.readlink(),其行为类似于 os.readlink()。 (由 Girts Folkmanis 在 bpo-30618 ä¸è´¡çŒ®ã€‚)
pdb¶
在 Windows 上 Pdb 现在支æŒ� ~/.pdbrc。 (由 Tim Hopper å’Œ Dan Lidral-Porter 在 bpo-20523 ä¸è´¡çŒ®ã€‚)
poplib¶
现在 POP3 å’Œ POP3_SSL å½“å®ƒä»¬çš„æž„é€ å™¨æ‰€ç»™å®šçš„è¶…æ—¶å�‚数为零以防æ¢åˆ›å»ºé�žé˜»å¡žå¥—æŽ¥å—æ—¶ä¼šå¼•å�‘ ValueError。 (由 Donghee Na 在 bpo-39259 ä¸è´¡çŒ®ã€‚)
pprint¶
现在 pprint 能美化打å�° types.SimpleNamespace。 (由 Carl Bordum Hansen 在 bpo-37376 ä¸è´¡çŒ®ã€‚)
pydoc¶
文档å—符串的显示现在ä¸�仅针对类ã€�函数ã€�方法ç‰ï¼Œä¹Ÿé’ˆå¯¹ä»»ä½•具有自己的 __doc__ 属性的对象。 (由 Serhiy Storchaka 在 bpo-40257 ä¸è´¡çŒ®ã€‚)
random¶
å¢žåŠ äº†æ–°çš„ random.Random.randbytes 方法:生æˆ�éš�机å—节串。 (由 Victor Stinner 在 bpo-40286 ä¸è´¡çŒ®ã€‚)
signal¶
对外公开了 Linux 专属的 signal.pidfd_send_signal() 用于�使用文件�述符而� pid 的进程��信�。 (bpo-38712)
smtplib¶
现在 SMTP å’Œ SMTP_SSL å½“å®ƒä»¬çš„æž„é€ å™¨æ‰€ç»™å®šçš„è¶…æ—¶å�‚数为零以防æ¢åˆ›å»ºé�žé˜»å¡žå¥—æŽ¥å—æ—¶ä¼šå¼•å�‘ ValueError。 (由 Donghee Na 在 bpo-39259 ä¸è´¡çŒ®ã€‚)
现在 LMTP æž„é€ å™¨å…·æœ‰ä¸€ä¸ªå�¯é€‰çš„ timeout å½¢å�‚。 (由 Donghee Na 在 bpo-39329 ä¸è´¡çŒ®ã€‚)
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 ä¸è´¡çŒ®ã€‚)
time¶
在 AIX 上,现在 thread_time() 是使用具有纳秒级精度的 thread_cputime() 实现,而ä¸�å†�是å�ªæœ‰ 10 毫秒精度的 clock_gettime(CLOCK_THREAD_CPUTIME_ID)。 (由 Batuhan Taskaya 在 bpo-40192 ä¸è´¡çŒ®ï¼‰
sys¶
新增 sys.platlibdir 属性:平å�°ä¸“属库目录的å��称。 å®ƒè¢«ç”¨äºŽæž„å»ºæ ‡å‡†åº“çš„è·¯å¾„å’Œå·²å®‰è£…æ‰©å±•æ¨¡å�—的路径。 它在大多数平å�°ä¸Šç‰äºŽ "lib"。 在 Fedora å’Œ SuSE 上,对于 64 ä½�å¹³å�°å®ƒå°†ç‰äºŽ "lib64"。 (由 Jan MatÄ›jek, MatÄ›j Cepl, Charalampos Stratakis å’Œ Victor Stinner 在 bpo-1294959 ä¸è´¡çŒ®ã€‚)
在之å‰�版本ä¸ï¼Œsys.stderr 在é�žäº¤äº’模å¼�时是带å�—缓冲的。 现在 stderr 默认总是带行缓冲的。 (由 Jendrik Seipp 在 bpo-13601 ä¸è´¡çŒ®ã€‚)
tracemalloc¶
å¢žåŠ äº† tracemalloc.reset_peak() 用于将跟踪的内å˜å�—峰值大å°�设为当å‰�大å°�,以测é‡�特定代ç �段的峰值。 (由 Huon Wilson 在 bpo-40630 ä¸è´¡çŒ®ã€‚)
typing¶
PEP 593 引入了一ç§� typing.Annotated 类型以使用上下文专属的元数æ�®æ�¥è£…饰现有类型,并将新的 include_extras å½¢å�‚æ·»åŠ åˆ° typing.get_type_hints() 以在è¿�行时访问元数æ�®ã€‚ (由 Till Varoquaux å’Œ Konstantin Kashin 贡献。)
unicodedata¶
Unicode 数�库已更新到 13.0.0 版。 (bpo-39926)。
venv¶
ç”± venv 所æ��供的激活脚本现在总是会使用 __VENV_PROMPT__ 设置的值æ�¥ä¸€è‡´åœ°æŒ‡æ˜Žå®ƒä»¬çš„自定义æ��示符。 在之å‰�ç‰ˆæœ¬ä¸æŸ�äº›è„šæœ¬ä¼šæ— æ�¡ä»¶åœ°ä½¿ç”¨ __VENV_PROMPT__,而å�¦ä¸€äº›è„šæœ¬å�ªåœ¨å…¶æ�°å¥½è¢«è®¾ç½®æ—¶ï¼ˆè¿™æ˜¯é»˜è®¤æƒ…况)æ‰�会使用,还有的脚本会改用 __VENV_NAME__。 (由 Brett Cannon 在 bpo-37663 ä¸è´¡çŒ®ã€‚)
xml¶
当把 xml.etree.ElementTree åº�列化为 XML 文件时属性内部的空白å—符现在将被ä¿�留。 ä¸�å�Œçš„行结æ�Ÿç¬¦ä¸�会å†�被æ£è§„化为 "n"。 这是对于如何解读 XML 规范 2.11 节的相关讨论的最终结果。 (由 Mefistotelis 在 bpo-39011 ä¸è´¡çŒ®ã€‚)
性能优化¶
优化了在推导å¼�ä¸ä¸ºä¸´æ—¶å�˜é‡�赋值的惯用方å¼�。 现在推导å¼�ä¸çš„
for y in [expr]会与简å�•赋值è¯å�¥y = exprä¸€æ ·å¿«é€Ÿã€‚ 例如:sums = [s for s in [0] for x in data for s in [s + x]]
��于
:=è¿�算符,这个惯用方å¼�ä¸�会使å�˜é‡�泄露到外部作用域ä¸ã€‚(由 Serhiy Storchaka 在 bpo-32856 ä¸è´¡çŒ®ã€‚)
优化了多线程应用ä¸çš„ä¿¡å�·å¤„ç�†ã€‚ 如果一个线程ä¸�是获得信å�·çš„主线程,å—节ç �求值循环ä¸�会在æ¯�æ�¡å—节ç �指令上被打æ–ä»¥æ£€æŸ¥æ— æ³•è¢«å¤„ç�†çš„æŒ‚èµ·ä¿¡å�·ã€‚ å�ªæœ‰ä¸»è§£é‡Šå™¨çš„主线程能够处ç�†ä¿¡å�·ã€‚
在之å‰�版本ä¸ï¼Œå—节ç �求值循环会在æ¯�æ�¡æŒ‡ä»¤ä¸Šè¢«æ‰“æ–直到主线程处ç�†äº†ä¿¡å�·ã€‚ (由 Victor Stinner 在 bpo-40010 上贡献。)
在 FreeBSD 上使用
closefrom()优化了subprocess模å�—。 (由 Ed Maste, Conrad Meyer, Kyle Evans, Kubilay Kocak å’Œ Victor Stinner 在 bpo-38061 ä¸è´¡çŒ®ã€‚)现在
PyLong_FromDouble()对于 long 范围内值的执行速度æ��å�‡è‡³ 1.87 å€�。 (由 Sergey Fedoseev 在 bpo-37986 ä¸è´¡çŒ®ã€‚)多个 Python 内置类型 (
range,tuple,set,frozenset,list,dict) 现在通过使用 PEP 590 vectorcall å��è®®å¾—åˆ°åŠ é€Ÿã€‚ (由 Donghee Na, Mark Shannon, Jeroen Demeyer å’Œ Petr Viktorin 在 bpo-37207 ä¸è´¡çŒ®ã€‚)当å�¦ä¸€é›†å�ˆè¿œå¤§äºŽåŸºç¡€é›†å�ˆçš„æƒ…况下优化了
difference_update()的性能。 (由 Evgeny Kapun æ��议,由 Michele Orrù 在 bpo-8425 ä¸è´¡çŒ®ä»£ç �。)Python çš„å°�对象分é…�器 (
obmalloc.c) 现在å…�许(至多)一个空ä½�å�¯ç”¨äºŽç«‹å�³é‡�用,而ä¸�必将其返回给 OS。 è¿™å�¯ä»¥é˜²æ¢ç®€å�•循环ä¸çš„多余消耗,在æ¯�次è¿ä»£ä¸å�¯ä»¥åˆ›å»ºå’Œé”€æ¯�全新的空ä½�。 (由 Tim Peters 在 bpo-37257 ä¸è´¡çŒ®ã€‚)浮点数è¿�ç®—ä¸çš„ floor division 现在会有更好的性能。 并且æ¤è¿�ç®—çš„
ZeroDivisionError消æ�¯ä¹ŸèŽ·å¾—äº†æ›´æ–°ã€‚ (由 Donghee Na 在 bpo-39434 ä¸è´¡çŒ®ã€‚)使用 UTF-8 å’Œ ascii ç¼–è§£ç �器解ç �çŸ ASCII å—ç¬¦ä¸²çŽ°åœ¨ä¼šåŠ å¿«å¤§çº¦ 15%。 (由 Inada Naoki 在 bpo-37348 ä¸è´¡çŒ®ã€‚)
以下是对从 Python 3.4 到 Python 3.9 的����情况的总结:
Python version 3.4 3.5 3.6 3.7 3.8 3.9
-------------- --- --- --- --- --- ---
Variable and attribute read access:
read_local 7.1 7.1 5.4 5.1 3.9 3.9
read_nonlocal 7.1 8.1 5.8 5.4 4.4 4.5
read_global 15.5 19.0 14.3 13.6 7.6 7.8
read_builtin 21.1 21.6 18.5 19.0 7.5 7.8
read_classvar_from_class 25.6 26.5 20.7 19.5 18.4 17.9
read_classvar_from_instance 22.8 23.5 18.8 17.1 16.4 16.9
read_instancevar 32.4 33.1 28.0 26.3 25.4 25.3
read_instancevar_slots 27.8 31.3 20.8 20.8 20.2 20.5
read_namedtuple 73.8 57.5 45.0 46.8 18.4 18.7
read_boundmethod 37.6 37.9 29.6 26.9 27.7 41.1
Variable and attribute write access:
write_local 8.7 9.3 5.5 5.3 4.3 4.3
write_nonlocal 10.5 11.1 5.6 5.5 4.7 4.8
write_global 19.7 21.2 18.0 18.0 15.8 16.7
write_classvar 92.9 96.0 104.6 102.1 39.2 39.8
write_instancevar 44.6 45.8 40.0 38.9 35.5 37.4
write_instancevar_slots 35.6 36.1 27.3 26.6 25.7 25.8
Data structure read access:
read_list 24.2 24.5 20.8 20.8 19.0 19.5
read_deque 24.7 25.5 20.2 20.6 19.8 20.2
read_dict 24.3 25.7 22.3 23.0 21.0 22.4
read_strdict 22.6 24.3 19.5 21.2 18.9 21.5
Data structure write access:
write_list 27.1 28.5 22.5 21.6 20.0 20.0
write_deque 28.7 30.1 22.7 21.8 23.5 21.7
write_dict 31.4 33.3 29.3 29.2 24.7 25.4
write_strdict 28.4 29.9 27.5 25.2 23.1 24.5
Stack (or queue) operations:
list_append_pop 93.4 112.7 75.4 74.2 50.8 50.6
deque_append_pop 43.5 57.0 49.4 49.2 42.5 44.2
deque_append_popleft 43.7 57.3 49.7 49.7 42.8 46.4
Timing loop:
loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3
以上结果是由以下��访问基准测试脚本所生�的: Tools/scripts/var_access_benchmark.py。 该基准测试脚本以纳秒为��显示时间。 基准测试数�是在一� Intel® Core™ i7-4960HQ 处�器 �行从 python.org 获�的 macOS 64 �编译版本所得到的。
弃用¶
distutils çš„
bdist_msi命令现在已被弃用,请改用bdist_wheel(wheel 包)。 (由 Hugo van Kemenade 在 bpo-39586 ä¸è´¡çŒ®ã€‚)目å‰�
math.factorial()接å�—具有é�žè´Ÿæ•´æ•°å€¼çš„float实例 (如5.0)。 对于é�žæ•´æ•°å’Œè´Ÿæµ®ç‚¹æ•°å®ƒä¼šå¼•å�‘ValueError。 æ¤è¡Œä¸ºçŽ°åœ¨å·²è¢«å¼ƒç”¨ã€‚ 在未æ�¥çš„ Python 版本ä¸å¯¹æ‰€æœ‰æµ®ç‚¹æ•°éƒ½å°†å¼•å�‘TypeError。 (由 Serhiy Storchaka 在 bpo-37315 ä¸è´¡çŒ®ã€‚)parserå’Œsymbol模å�—已被弃用并将在未æ�¥çš„ Python 版本ä¸ç§»é™¤ã€‚ 对于大多数用例,用户都å�¯ä»¥ä½¿ç”¨ast模å�—æ�¥æŽ§åˆ¶æŠ½è±¡è¯æ³•æ ‘ (AST) 的生æˆ�和编译阶段。公有 C API 函数
PyParser_SimpleParseStringFlags(),PyParser_SimpleParseStringFlagsFilename(),PyParser_SimpleParseFileFlags()å’ŒPyNode_Compile()已被弃用并将在 Python 3.10 ä¸ä¸Žæ—§çš„è§£æž�器一起被移除。在布尔è¿�ç®—ä¸ä½¿ç”¨
NotImplementedå·²è¢«å¼ƒç”¨ï¼Œå› ä¸ºå®ƒå‡ ä¹Žå¿…å®šæ˜¯ä¸�æ£ç¡®çš„富比较è¿�算符实现的结果。 它将在未æ�¥çš„ Python 版本ä¸å¼•å�‘TypeError。 (由 Josh Rosenberg 在 bpo-35712 ä¸è´¡çŒ®ã€‚)random模å�—ç›®å‰�接å�—任何å�¯å“ˆå¸Œç±»åž‹ä½œä¸ºå�¯èƒ½çš„ç§�å�值。 ä¸�幸的是,æŸ�äº›è¿™æ ·çš„ç±»åž‹å¹¶ä¸�ä¿�è¯�具有确定性的哈希值。 在 Python 3.9 之å�Žï¼Œè¯¥æ¨¡å�—å°†é™�定其ç§�å�值为None,int,float,str,bytes以å�Šbytearray。打开
GzipFile文件用于写入而ä¸�指定 mode å�‚数的特性已被弃用。 在未æ�¥çš„ Python 版本ä¸å°†æ€»æ˜¯é»˜è®¤æ‰“开用于读å�–。 在打开文件用于写入时请指定 mode å�‚数以é�™é»˜ç›¸å…³è¦å‘Šä¿¡æ�¯ã€‚ (由 Serhiy Storchaka 在 bpo-28286 ä¸è´¡çŒ®ã€‚)弃用了
_tkinter.TkappTypeçš„split()方法而改用splitlist()æ–¹æ³•ï¼Œæ¤æ–¹æ³•具有更稳定且å�¯é¢„测的行为。 (由 Serhiy Storchaka 在 bpo-38371 ä¸è´¡çŒ®ã€‚)将å��程对象显å¼�ä¼ é€’ç»™
asyncio.wait()çš„å�šæ³•å·²è¢«å¼ƒç”¨å¹¶ä¸”å°†åœ¨ 3.11 版ä¸è¢«ç§»é™¤ã€‚ (由 Yury Selivanov å’Œ Kyle Stanley 在 bpo-34790 ä¸è´¡çŒ®ã€‚)binhex4 å’Œ hexbin4 æ ‡å‡†çŽ°å·²è¢«å¼ƒç”¨ã€‚
binhex模�和下列binascii函数现已被弃用:b2a_hqx(),a2b_hqx()rlecode_hqx(),rledecode_hqx()
(由 Victor Stinner 在 bpo-39353 ä¸è´¡çŒ®ã€‚)
astç±»slice,Indexå’ŒExtSlice被视为已弃用并将在未æ�¥çš„ Python 版本ä¸è¢«ç§»é™¤ã€‚ 应当使用value本身而ä¸�å†�是Index(value)。 应当使用Tuple(slices, Load())而ä¸�å†�是ExtSlice(slices)。 (由 Serhiy Storchaka 在 bpo-34822 ä¸è´¡çŒ®ã€‚)astç±»Suite,Param,AugLoadå’ŒAugStore被视为已弃用并将在未æ�¥çš„ Python 版本ä¸è¢«ç§»é™¤ã€‚ 它们ä¸�会被解æž�器所生æˆ�且ä¸�会被 Python 3 ä¸çš„代ç �生æˆ�器所接å�—。 (由 Batuhan Taskaya 在 bpo-39639 å’Œ bpo-39969 ä¸ä»¥å�Š Serhiy Storchaka 在 bpo-39988 ä¸è´¡çŒ®ã€‚)PyEval_InitThreads()å’ŒPyEval_ThreadsInitialized()函数现已被弃用并将在 Python 3.11 ä¸ç§»é™¤ã€‚ 现在调用PyEval_InitThreads()将没有任何效果。 自 Python 3.7 èµ· GIL 会由Py_Initialize()åˆ�始化。(由 Victor Stinner 在 bpo-39877 ä¸è´¡çŒ®ã€‚ï¼‰ä¼ å…¥
None作为shlex.split()函数的第一个å�‚æ•°çš„å�šæ³•å·²è¢«å¼ƒç”¨ã€‚ (由 Zackery Spytz 在 bpo-33262 ä¸è´¡çŒ®ã€‚)smtpd.MailmanProxy()çŽ°åœ¨å·²è¢«å¼ƒç”¨ï¼Œå› ä¸ºå®ƒåœ¨æ²¡æœ‰å¤–éƒ¨æ¨¡å�—mailmançš„æƒ…å†µä¸‹æ— æ³•ä½¿ç”¨ã€‚ (由 Samuel Colvin 在 bpo-35800 ä¸è´¡çŒ®ã€‚)现在
lib2to3模å�—å°†å�‘出PendingDeprecationWarning。 Python 3.9 已切æ�¢åˆ° PEG è§£æž�器 (å�‚è§� PEP 617),Python 3.10 å�¯ä»¥ä¼šåŒ…å�« lib2to3 çš„ LL(1) è§£æž�器所ä¸�能解æž�çš„æ–°è¯æ³•。lib2to3模å�—å�¯èƒ½ä¼šåœ¨æœªæ�¥çš„ Python 版本ä¸è¢«ç§»å‡ºæ ‡å‡†åº“。 请考虑使用第三方替æ�¢ä¾‹å¦‚ LibCST 或 parso。 (由 Carl Meyer 在 bpo-40360 ä¸è´¡çŒ®ã€‚)random.shuffle()çš„ random å½¢å�‚已被弃用。 (由 Raymond Hettinger 在 bpo-40465 ä¸è´¡çŒ®ã€‚)
移除¶
unittest.mock.__version__上的错误版本已ç»�被移除。nntplib.NNTP:xpath()å’Œxgtitle()方法已被移除。 这些方法自 Python 3.3 起已被弃用。 一般æ�¥è¯´ï¼Œè¿™äº›æ‰©å±•都ä¸�å†�为 NNTP æœ�务管ç�†ç¨‹åº�所支æŒ�或å�¯ç”¨ã€‚ 对于xgtitle(),请改用nntplib.NNTP.descriptions()或nntplib.NNTP.description()。 (由 Donghee Na 在 bpo-39366 ä¸è´¡çŒ®ã€‚)array.array:tostring()å’Œfromstring()方法已被移除。 它们分别是tobytes()å’Œfrombytes()的别å��,自 Python 3.2 起已被弃用。 (由 Victor Stinner 在 bpo-38916 ä¸è´¡çŒ®ã€‚)未写入文档的
sys.callstats()函数已被移除。 自 Python 3.7 起它就已被弃用并且总是会返回None。 它需è¦�一个特殊的构建选项CALL_PROFILE而该选项在 Python 3.7 ä¸å·²è¢«ç§»é™¤ã€‚ (由 Victor Stinner 在 bpo-37414 ä¸è´¡çŒ®ã€‚)sys.getcheckinterval()å’Œsys.setcheckinterval()函数已被移除。 它们自 Python 3.2 起已被弃用。 请改用sys.getswitchinterval()å’Œsys.setswitchinterval()。 (由 Victor Stinner 在 bpo-37392 ä¸è´¡çŒ®ã€‚)C 函数
PyImport_Cleanup()已被移除。 它原本的文档为: "清空模å�—表。 ä»…é™�内部使用。" (由 Victor Stinner 在 bpo-36710 ä¸è´¡çŒ®ã€‚)_dummy_threadå’Œdummy_threading模å�—已被移除。 这些模å�—自 Python 3.7 起已被弃用,它们需è¦�线程支æŒ�。 (由 Victor Stinner 在 bpo-37312 ä¸è´¡çŒ®ã€‚)aifc.open()的别å��aifc.openfp(),sunau.open()的别å��sunau.openfp(),以å�Šwave.open()的别å��wave.openfp()已被移除。 它们自 Python 3.7 起已被弃用。 (由 Victor Stinner 在 bpo-37320 ä¸è´¡çŒ®ã€‚)threading.Threadçš„isAlive()方法已被移除。 它自 Python 3.8 起已被弃用。 请改用is_alive()。 (由 Donghee Na 在 bpo-37804 ä¸è´¡çŒ®ã€‚)ElementTree模å�—ä¸ElementTreeå’ŒElementç‰ç±»çš„getchildren()å’Œgetiterator()方法已被移除。 它们在 Python 3.2 ä¸å·²è¢«å¼ƒç”¨ã€‚ 请使用iter(x)或list(x)替代x.getchildren()并用x.iter()或list(x.iter())替代x.getiterator()。 (由 Serhiy Storchaka 在 bpo-36543 ä¸è´¡çŒ®ã€‚)旧的
plistlibAPI 已被移除,它自 Python 3.4 起已被弃用。 请使用load(),loads(),dump()å’Œdumps()ç‰å‡½æ•°ã€‚ æ¤å¤–,use_builtin_types å½¢å�‚已被移除而总是会使用bytes对象。 (由 Jon Janzen 在 bpo-36409 ä¸è´¡çŒ®ã€‚)C 函数
PyGen_NeedsFinalizing已被移除。 它未被写入文档ã€�未ç»�测试,且自 PEP 442 实现之å�Žæœªåœ¨ CPython 的任何地方被使用。 ç”± Joannah Nanjekye æ��供补ä¸�。 (由 Joannah Nanjekye 在 bpo-15088 ä¸è´¡çŒ®ã€‚)自 Python 3.1 起被弃用的别å��
base64.encodestring()å’Œbase64.decodestring()已被移除:请改用base64.encodebytes()å’Œbase64.decodebytes()。 (由 Victor Stinner 在 bpo-39351 ä¸è´¡çŒ®ã€‚)fractions.gcd()函数已被移除,它自 Python 3.5 起被弃用 (bpo-22486):请改用math.gcd()。 (由 Victor Stinner 在 bpo-39350 ä¸è´¡çŒ®ã€‚)bz2.BZ2Fileçš„ buffering å½¢å�‚已被移除。 它自 Python 3.0 èµ·å�³è¢«å¿½ç•¥ï¼Œä½¿ç”¨å®ƒå°†ä¼šå¼•å�‘DeprecationWarning。 è¯·ä¼ å…¥ä¸€ä¸ªæ‰“å¼€æ–‡ä»¶å¯¹è±¡æ�¥æŽ§åˆ¶æ–‡ä»¶çš„æ‰“开方å¼�。 (由 Victor Stinner 在 bpo-39357 ä¸è´¡çŒ®ã€‚)json.loads()çš„ encoding å½¢å�‚已被移除。 它在 Python 3.1 ä¸å·²è¢«å¼ƒç”¨å’Œå¿½ç•¥ï¼›è‡ª Python 3.8 起使用它将会引å�‘DeprecationWarning。 (由 Inada Naoki 在 bpo-39377 ä¸è´¡çŒ®ã€‚)with (await asyncio.lock):å’Œwith (yield from asyncio.lock):è¯å�¥å·²ä¸�å†�å�—支æŒ�,请改用async with lock。asyncio.Conditionå’Œasyncio.Semaphore也å�Œæ ·å¦‚æ¤ã€‚ (由 Andrew Svetlov 在 bpo-34793 ä¸è´¡çŒ®ã€‚)sys.getcounts()函数,-X showalloccount命令行选项以å�Š C 结构体PyConfigçš„show_alloc_countå—æ®µå·²è¢«ç§»é™¤ã€‚ 它们需è¦�使用定义了COUNT_ALLOCSå®�的特殊 Python 编译版本。 (由 Victor Stinner 在 bpo-39489 ä¸è´¡çŒ®ã€‚)typing.NamedTuple类的_field_types属性已被移除。 它自 Python 3.8 起已被弃用。 请改用__annotations__属性。 (由 Serhiy Storchaka 在 bpo-40182 ä¸è´¡çŒ®ã€‚)symtable.SymbolTable.has_exec()方法已被移除。 它自 2006 年起已被弃用,当被调用时仅会返回False。 (由 Batuhan Taskaya 在 bpo-40208 ä¸è´¡çŒ®ã€‚)asyncio.Task.current_task()å’Œasyncio.Task.all_tasks()已被移除。 它们自 Python 3.7 èµ·å·²è¢«å¼ƒç”¨ï¼Œä½ å�¯ä»¥æ”¹ç”¨asyncio.current_task()å’Œasyncio.all_tasks()。 (由 Rémi Lapeyre 在 bpo-40967 ä¸è´¡çŒ®ã€‚)html.parser.HTMLParser类的unescape()方法已被移除(它自 Python 3.4 起已被弃用)。 应当使用html.unescape()æ�¥å°†å—符引用转æ�¢ä¸ºå¯¹åº”çš„ unicode å—符。
移�到 Python 3.9¶
本节列出了先å‰�æ��述的更改以å�Šå�¯èƒ½éœ€è¦�更改代ç �的其他错误修æ£.
Python API 的�化¶
__import__()å’Œimportlib.util.resolve_name()现在会引å�‘ImportErrorå�–代之å‰�所引å�‘çš„ValueError。 æ�•获特定异常类型并å�Œæ—¶æ”¯æŒ� Python 3.9 和更早版本的调用者将需è¦�使用except (ImportError, ValueError):æ�¥å�Œæ—¶æ�•获两者。venv激活脚本ä¸�å†�å°†__VENV_PROMPT__被设为""的情况作为特例处ç�†ã€‚select.epoll.unregister()方法ä¸�会å†�忽略EBADF错误。 (由 Victor Stinner 在 bpo-39239 ä¸è´¡çŒ®ã€‚)bz2.BZ2Fileçš„ compresslevel å½¢å�‚å·²æˆ�为仅é™�关键å—å½¢å�‚ï¼Œå› ä¸º buffering å½¢å�‚已被移除。 (由 Victor Stinner 在 bpo-39357 ä¸è´¡çŒ®ã€‚)简化了 AST 的抽å�–æ“�作。 简å�•索引将以它们的值æ�¥ä»£è¡¨ï¼Œæ‰©å±•切片将以元组形å¼�æ�¥ä»£è¡¨ã€‚
Index(value)将返回value本身,ExtSlice(slices)将返回Tuple(slices, Load())。 (由 Serhiy Storchaka 在 bpo-34822 ä¸è´¡çŒ®ã€‚)当使用了
-E或-I命令行å�‚æ•°æ—¶importlib模å�—现在会忽略PYTHONCASEOK环境å�˜é‡�。encoding å½¢å�‚已作为仅é™�关键å—å½¢å�‚è¢«æ·»åŠ åˆ°
ftplib.FTPå’Œftplib.FTP_TLS类,并且默认编ç �æ ¼å¼�ç”± Latin-1 改为 UTF-8 以é�µå¾ª RFC 2640。asyncio.loop.shutdown_default_executor()å·²è¢«æ·»åŠ åˆ°AbstractEventLoop,这æ„�味ç�€ç»§æ‰¿è‡ªå®ƒçš„æ›¿ä»£äº‹ä»¶å¾ªçŽ¯åº”å½“å®šä¹‰æ¤æ–¹æ³•。 (由 Kyle Stanley 在 bpo-34037 ä¸è´¡çŒ®ã€‚)更新了
__future__模å�—䏿œªæ�¥ç‰¹æ€§æ——æ ‡çš„å¸¸é‡�值以防æ¢ä¸Žç¼–è¯‘å™¨æ——æ ‡ç›¸å†²çª�。 在之å‰�版本ä¸PyCF_ALLOW_TOP_LEVEL_AWAIT会与CO_FUTURE_DIVISIONå�‘生冲çª�。 (由 Batuhan Taskaya 在 bpo-39562 ä¸è´¡çŒ®ã€‚)array('u')现在使用wchar_t作为 C 类型而ä¸�是Py_UNICODE。 这一更改ä¸�会影å“�å…¶è¡Œä¸ºï¼Œå› ä¸ºè‡ª Python 3.3 èµ·Py_UNICODE就是wchar_t的别å��。 (由 Inada Naoki 在 bpo-34538 ä¸è´¡çŒ®ã€‚)现在
logging.getLogger()API å½“ä¼ å…¥å��ç§°'root'æ—¶å°†è¿”å›žæ ¹æ—¥å¿—è®°å½•å™¨ï¼Œè€Œåœ¨ä¹‹å‰�它则返回一个å��为'root'çš„é�žæ ¹æ—¥å¿—记录器。 è¿™å�¯èƒ½ä¼šå½±å“�到用户代ç �明确希望使用一个å��为'root'çš„é�žæ ¹æ—¥å¿—记录器,或在æŸ�个å��为'root.py'的最高层级模å�—ä¸ä½¿ç”¨logging.getLogger(__name__)æ�¥å®žä¾‹åŒ–日志记录器的情况。 (由 Vinay Sajip 在 bpo-37742 ä¸è´¡çŒ®ã€‚)现在
PurePath的拆分处ç�†å½“ä¼ å…¥str或PurePath的实例以外的对象时会返回NotImplemented而ä¸�是引å�‘TypeError。 这将å…�许创建ä¸�继承自上述类型的兼容类。 (由 Roger Aiudi 在 bpo-34775 ä¸è´¡çŒ®ã€‚)从 Python 3.9.5 开始
ipaddress模å�—ä¸�å†�接å�— IPv4 地å�€å—ç¬¦ä¸²ä¸æœ‰ä»»ä½•å‰�缀的零。 å‰�缀的零有æ§ä¹‰ä¸”会被æŸ�些库解读为八进制数å—。 例如旧版函数socket.inet_aton()就瘵å‰�缀的零视为八进制数å—。 最新inet_pton()çš„ glibc 实现则ä¸�接å�—任何å‰�缀的零。 (由 Christian Heimes 在 bpo-36384 ä¸è´¡çŒ®ï¼‰ã€‚codecs.lookup()现在会以与encodings.normalize_encoding()相å�Œçš„æ–¹å¼�æ£è§„化编ç �æ ¼å¼�å��称,ä¸�å�Œä¹‹å¤„在于codecs.lookup()还会将å��称转æ�¢ä¸ºå°�写形å¼�。 例如"latex+latin1"ç¼–å†™æ ¼å¼�å��称现在会被æ£è§„化为"latex_latin1"。 (由 Jordon Xu 在 bpo-37751 ä¸è´¡çŒ®ã€‚)
C API 的�化¶
Instances of å †åˆ†é…�类型 的实例(例如使用
PyType_FromSpec()和类似 API 创建的实例)自 Python 3.8 起会带有一个对其类型对象的引用。 æ£å¦‚ Python 3.8 çš„ "C API çš„å�˜åŒ–" 部分所述,对于大多数情况æ�¥è¯´ï¼Œè¿™åº”当ä¸�会有任何副作用,但对于具有自定义tp_traverse函数的类型æ�¥è¯´ï¼Œåˆ™è¦�ç¡®ä¿�æ‰€æœ‰å †åˆ†é…�类型的自定义tp_traverse函数å�¯è®¿é—®å¯¹è±¡çš„类型。示例:
int foo_traverse(foo_struct *self, visitproc visit, void *arg) { // Rest of the traverse function #if PY_VERSION_HEX >= 0x03090000 // This was not needed before Python 3.9 (Python issue 35810 and 40217) Py_VISIT(Py_TYPE(self)); #endif }
å¦‚æžœä½ çš„é��历函数委托给了其基类(或其他类)的
tp_traverse,则è¦�ç¡®ä¿�Py_TYPE(self)å�ªè¢«è®¿é—®ä¸€æ¬¡ã€‚ 请注æ„�应当å�ªæœ‰ å †ç±»åž‹ å�¯è®¿é—®tp_traverseä¸çš„类型。举例æ�¥è¯´ï¼Œå¦‚æžœä½ çš„
tp_traverse函数包括以下内容:base->tp_traverse(self, visit, arg)
则è¦�æ·»åŠ :
#if PY_VERSION_HEX >= 0x03090000 // This was not needed before Python 3.9 (bpo-35810 and bpo-40217) if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) { // a heap type's tp_traverse already visited Py_TYPE(self) } else { Py_VISIT(Py_TYPE(self)); } #else
PyEval_CallObject,PyEval_CallFunction,PyEval_CallMethod和PyEval_CallObjectWithKeywords函数已被弃用。 请改用PyObject_Call()�其�化形�。 (详情�� bpo-29548。)
CPython å—节ç �的改å�˜Â¶
æ·»åŠ äº†
LOAD_ASSERTION_ERRORæ“�作ç �用于处ç�†assertè¯å�¥ã€‚ 在之å‰�的版本ä¸ï¼Œå¦‚æžœAssertionError异常被å±�蔽则 assert è¯å�¥å°†ä¸�能æ£å¸¸è¿�作。 (由 Zackery Spytz 在 bpo-34880 ä¸è´¡çŒ®ã€‚)COMPARE_OPæ“�作ç �已被拆分为四个å�•独指令:COMPARE_OP用于富比较IS_OP用于 'is' å’Œ 'is not' 检测CONTAINS_OP用于 'in' å’Œ 'not in' 检测JUMP_IF_NOT_EXC_MATCH用于检查 'try-except' è¯å�¥ä¸çš„异常。
(由 Mark Shannon 在 bpo-39156 ä¸è´¡çŒ®ã€‚)
构建的改�¶
�
configureè„šæœ¬æ·»åŠ äº†--with-platlibdir选项:平å�°ä¸“属库目录的å��称,ä¿�å˜åœ¨æ–°çš„sys.platlibdir属性ä¸ã€‚ 请å�‚阅sys.platlibdir属性了解更多信æ�¯ã€‚ (由 Jan MatÄ›jek, MatÄ›j Cepl, Charalampos Stratakis å’Œ Victor Stinner 在 bpo-1294959 ä¸è´¡çŒ®ã€‚)COUNT_ALLOCS特殊构建å®�已被移除。 (由 Victor Stinner 在 bpo-39489 ä¸è´¡çŒ®ã€‚)在é�ž Windows å¹³å�°ä¸Šï¼ŒçŽ°åœ¨éœ€è¦�用
setenv()å’Œunsetenv()函数æ�¥æž„建 Python。 (由 Victor Stinner 在 bpo-39395 ä¸è´¡çŒ®ã€‚)在é�ž Windows å¹³å�°ä¸Šï¼Œåˆ›å»º
bdist_wininst安装器现在已ä¸�å�—官方支æŒ�。 (详情å�‚è§� bpo-10945。)当在 macOS 上用æº�代ç �编译 Python 时,
_tkinter现在会链接到é�žç³»ç»Ÿçš„ Tcl å’Œ Tk 框架,如果它们被安装到/Library/Frameworksçš„è¯�,就如在较旧的 macOS å�‘è¡Œç‰ˆä¸Šçš„æƒ…å†µä¸€æ ·ã€‚ 如果通过使用--enable-universalsdk或-isysroot显å¼�地é…�置了 macOS SDK,则å�ªä¼šæ�œç´¢ SDK 本身。 默认行为ä»�ç„¶å�¯ä»¥é€šè¿‡--with-tcltk-includeså’Œ--with-tcltk-libsæ�¥è¦†ç›–。 (由 Ned Deily 在 bpo-34956 ä¸è´¡çŒ®ã€‚)Python 现在å�¯ä»¥é’ˆå¯¹ Windows 10 ARM64 进行编译。 (由 Steve Dower 在 bpo-33125 ä¸è´¡çŒ®ã€‚)
现在当使用
--pgo时一些å�•独的测试会被跳过。 è¿™äº›æµ‹è¯•æ˜¾è‘—å¢žåŠ äº† PGO 任务的时间并且å�¯èƒ½æ— 助于æ��å�‡æœ€ç»ˆå�¯æ‰§è¡Œæ–‡ä»¶çš„优化程度。 è¿™æ ·èƒ½ä½¿ä»»åŠ¡åŠ é€Ÿå¤§çº¦ 15 å€�。 è¿�行完整的å�•元测试是很慢的。 这个改å�˜å�¯èƒ½å¯¼è‡´ä¼˜åŒ–程åº�ç¨�å·®çš„æž„å»ºï¼Œå› ä¸ºå°†è¢«æ‰§è¡Œçš„ä»£ç �分支ä¸�够多。 å¦‚æžœä½ æ„¿æ„�ç‰å¾…更缓慢的构建,则å�¯ä»¥ä½¿ç”¨./configure [..] PROFILE_TASK="-m test --pgo-extended"æ�¥æ�¢å¤�旧版本的行为。 我们ä¸�ä¿�è¯�哪个 PGO 任务集能产生更快的构建。 关心æ¤é—®é¢˜çš„用户应当自行è¿�è¡Œç›¸å…³åŸºå‡†æµ‹è¯•ï¼Œå› ä¸ºç»“æžœå�¯èƒ½å�–决于具体环境ã€�工作负载以å�Šç¼–译工具链。 (请å�‚阅 bpo-36044 å’Œ bpo-37707 了解详情。)
C API 的改�¶
新的特性¶
PEP 573: æ·»åŠ äº†
PyType_FromModuleAndSpec()用于将模å�—与类关è�”ï¼›æ·»åŠ äº†PyType_GetModule()å’ŒPyType_GetModuleState()用于获å�–模å�—å�Šå…¶çжæ€�;以å�ŠPyCMethodå’ŒMETH_METHOD用于å…�许一个方法访问其定义所在的类。 (由 Marcel Plch å’Œ Petr Viktorin 在 d:issue:38787 ä¸è´¡çŒ®ã€‚ï¼‰å¢žåŠ äº†
PyFrame_GetCode()函数:获å�–帧代ç �。 å¢žåŠ äº†PyFrame_GetBack()函数:获å�–帧的下一个外部帧。 (由 Victor Stinner 在 bpo-40421 ä¸è´¡çŒ®ã€‚)将
PyFrame_GetLineNumber()æ·»åŠ åˆ°å�—é™�çš„ C API。 (由 Victor Stinner 在 bpo-40421 ä¸è´¡çŒ®ã€‚ï¼‰å¢žåŠ äº†
PyThreadState_GetInterpreter()å’ŒPyInterpreterState_Get()函数用于获å�–解释器。 å¢žåŠ äº†PyThreadState_GetFrame()函数用于获å�– Python 线程状æ€�的当å‰�帧。 å¢žåŠ äº†PyThreadState_GetID()函数:获å�– Python 线程状æ€�çš„å”¯ä¸€æ ‡è¯†ç¬¦ã€‚ (由 Victor Stinner 在 bpo-39947 ä¸è´¡çŒ®ã€‚)将新的公有
PyObject_CallNoArgs()å‡½æ•°æ·»åŠ åˆ° C API,该函数å�¯ä¸�带任何å�‚数调用一个 Python å�¯è°ƒç”¨å¯¹è±¡ã€‚ 它是ä¸�带å�‚数调用 Python å�¯è°ƒç”¨å¯¹è±¡æœ€æœ‰æ•ˆçŽ‡çš„æ–¹å¼�。 (由 Victor Stinner 在 bpo-37194 ä¸è´¡çŒ®ã€‚)å�—é™� C API ä¸çš„æ”¹å�˜ï¼ˆå¦‚果定义了
Py_LIMITED_API�):�供
Py_EnterRecursiveCall()å’ŒPy_LeaveRecursiveCall()作为常规函数用于å�—é™� API。 在之å‰�ç‰ˆæœ¬ä¸æ˜¯ä½¿ç”¨å®�定义,但这些å®�ä¸�èƒ½ä¸Žæ— æ³•è®¿é—®PyThreadState.recursion_depthå—æ®µçš„å�—é™� C API 一å�Œç¼–译(该结构体在å�—é™� C API 䏿˜¯ä¸�é€�明的)。PyObject_INIT()å’ŒPyObject_INIT_VAR()å·²æˆ�为常规“ä¸�é€�明â€�函数以éš�è—�实现细节。
(由 Victor Stinner 在 bpo-38644 å’Œ bpo-39542 ä¸è´¡çŒ®ã€‚)
å¢žåŠ äº†
PyModule_AddType()函数以å��åŠ©å°†ç±»åž‹åŠ å…¥åˆ°æ¨¡å�—ä¸ã€‚ (由 Donghee Na 在 bpo-40024 ä¸è´¡çŒ®ã€‚)将
PyObject_GC_IsTracked()å’ŒPyObject_GC_IsFinalized()å‡½æ•°æ·»åŠ åˆ°å…¬æœ‰ API 以å…�许分别查询 Python 对象当å‰�是æ£åœ¨è¢«è¿½è¸ªè¿˜æ˜¯å·²ç»�被垃圾回收器所终结。 (由 Pablo Galindo Salgado 在 bpo-40241 ä¸è´¡çŒ®ã€‚ï¼‰å¢žåŠ äº†
_PyObject_FunctionStr()以获å�–函数类对象的用户å�‹å¥½çš„表示形å¼�。 (由 Jeroen Demeyer 在 bpo-37645 ä¸ä¿®æ£ã€‚ï¼‰å¢žåŠ äº†
PyObject_CallOneArg()用于调用具有一个ä½�ç½®å�‚数的对象(由 Jeroen Demeyer 在 bpo-37483 ä¸ä¿®æ£ã€‚)
移�到 Python 3.9¶
PyInterpreterState.eval_frame(PEP 523) 现在需è¦�有新的强制性形å�‚ tstate (PyThreadState*)。 (由 Victor Stinner 在 bpo-38500 ä¸è´¡çŒ®ã€‚)扩展模å�—:
PyModuleDefçš„m_traverse,m_clearå’Œm_freeç‰å‡½æ•°åœ¨æ¨¡å�—状æ€�被请求但尚未被分é…�æ—¶å°†ä¸�会å†�被调用。 è¿™ç§�情况出现在模å�—被创建之å�Žä¸”模å�—被执行 (Py_mod_exec函数) 之å‰�的时刻。 更准确地说,这些函数在m_size大于 0 并且模å�—状æ€�(å�³PyModule_GetState()的返回值)为NULLæ—¶å°†ä¸�会被调用。没有模å�—状æ€�的扩展模å�— (
m_size <= 0) �会�到影�。现在如果
Py_AddPendingCall()是在å�解释器内部被调用,该函数会被排入å�解释器的调用日程,而ä¸�是由主解释器调用。 æ¯�个å�解释器现在都拥有它们自己的调用日程列表。 (由 Victor Stinner 在 bpo-39984 ä¸è´¡çŒ®ã€‚)当
-E选项被使用 (如果PyConfig.use_environment设为0) æ—¶å°†ä¸�å†�使用 Windows 注册表æ�¥åˆ�始化sys.path。 这会影å“�在 Windows 上嵌入 Python çš„æ“�作。 (由 Zackery Spytz 在 bpo-8901 ä¸è´¡çŒ®ã€‚)全局å�˜é‡�
PyStructSequence_UnnamedField现在为常é‡�并且指å�‘一个å—符串常é‡�。 (由 Serhiy Storchaka 在 bpo-38650 ä¸è´¡çŒ®ã€‚)现在
PyGC_Head结构是ä¸�é€�明的。 它å�ªåœ¨å†…部 C API (pycore_gc.h) ä¸å®šä¹‰ã€‚ (由 Victor Stinner 在 bpo-40241 ä¸è´¡çŒ®ã€‚)Py_UNICODE_COPY,Py_UNICODE_FILL,PyUnicode_WSTR_LENGTH,PyUnicode_FromUnicode(),PyUnicode_AsUnicode(),_PyUnicode_AsUnicodeå’ŒPyUnicode_AsUnicodeAndSize()在 C ä¸å·²è¢«æ ‡è®°ä¸ºå¼ƒç”¨ã€‚ 自 Python 3.3 起它们就已被 PEP 393 弃用。 (由 Inada Naoki 在 bpo-36346 ä¸è´¡çŒ®ã€‚)Py_FatalError()函数会被一个自动记录当å‰�函数å��ç§°çš„å®�所替代,除é�žå·²å®šä¹‰äº†Py_LIMITED_APIå®�。 (由 Victor Stinner 在 bpo-39882 ä¸è´¡çŒ®ã€‚)vectorcall å��议现在è¦�求调用者å�ªä¼ å…¥å—符串作为键å��。 (请å�‚阅 bpo-37540 了解详情。)
多个�和函数的实现细节现在已被��:
PyObject_IS_GC()�已被转�为函数。PyObject_NEW()�已�为PyObject_New�的别�,而PyObject_NEW_VAR()�已�为PyObject_NewVar�的别�。 它们��直接访问PyTypeObject.tp_basicsize�员。PyObject_GET_WEAKREFS_LISTPTR()�已被转�为函数:该�会直接访问PyTypeObject.tp_weaklistoffset�员。PyObject_CheckBuffer()�已被转�为函数:该�会直接访问PyTypeObject.tp_as_buffer�员。现在
PyIndex_Check()总是被声明为��明函数以��实现细节;PyIndex_Check()�已被移除。 该�会直接访问PyTypeObject.tp_as_number�员。
(详情请�阅 bpo-40170。)
移除¶
pyfpe.hçš„PyFPE_START_PROTECT()å’ŒPyFPE_END_PROTECT()å®�已从å�—é™�çš„ C API ä¸è¢«æŽ’除。 (由 Victor Stinner 在 bpo-38835 ä¸è´¡çŒ®ã€‚)PyTypeObject çš„
tp_print空ä½�已被移除。 它在 Python 2.7 å�Šä¹‹å‰�的版本ä¸è¢«ç”¨æ�¥å°†å¯¹è±¡æ‰“å�°åˆ°æ–‡ä»¶ã€‚ 自 Python 3.0 起,它已被忽略并且ä¸�å†�使用。 (由 Jeroen Demeyer 在 bpo-36974 ä¸è´¡çŒ®ã€‚)å�—é™� C API ä¸çš„æ”¹å�˜ï¼ˆå¦‚果定义了
Py_LIMITED_APIå®�):以下函数已从å�—é™� C API 䏿ޒ除:
PyThreadState_DeleteCurrent()(由 Joannah Nanjekye 在 bpo-37878 ä¸è´¡çŒ®ã€‚)_Py_CheckRecursionLimit_Py_NewReference()_Py_ForgetReference()_PyTraceMalloc_NewReference()_Py_GetRefTotal()在å�—é™� C API ä¸ä»Žæœªä½¿ç”¨çš„垃圾箱机制。
PyTrash_UNWIND_LEVELPy_TRASHCAN_BEGIN_CONDITIONPy_TRASHCAN_BEGINPy_TRASHCAN_ENDPy_TRASHCAN_SAFE_BEGINPy_TRASHCAN_SAFE_END
已将下列函数和定义移至内部 C API:
_PyDebug_PrintTotalRefs()_Py_PrintReferences()_Py_PrintReferenceAddresses()_Py_tracemalloc_config_Py_AddToAllObjects()(Py_TRACE_REFS构建专属)
(由 Victor Stinner 在 bpo-38644 å’Œ bpo-39542 ä¸è´¡çŒ®ã€‚)
移除了
_PyRuntime.getframeé’©å�并移除了_PyThreadState_GetFrameå®�,该å®�是_PyRuntime.getframe的一个别å��。 它们仅由内部 C API 对外公开。 å�Œæ ·åœ°ç§»é™¤äº†PyThreadFrameGetter类型。 (由 Victor Stinner 在 bpo-39946 ä¸è´¡çŒ®ã€‚)从 C API 移除了下列函数。 请显å¼�地调用
PyGC_Collect()æ�¥æ¸…空所有自由列表。 (由 Inada Naoki å’Œ Victor Stinner 在 bpo-37340, bpo-38896 å’Œ bpo-40428 ä¸è´¡çŒ®ã€‚)PyAsyncGen_ClearFreeLists()PyContext_ClearFreeList()PyDict_ClearFreeList()PyFloat_ClearFreeList()PyFrame_ClearFreeList()PyList_ClearFreeList()PyMethod_ClearFreeList()å’ŒPyCFunction_ClearFreeList(): 绑定方法对象的自由列表已被移除。PySet_ClearFreeList(): 集å�ˆè‡ªç”±åˆ—表已在 Python 3.4 ä¸è¢«ç§»é™¤ã€‚PyTuple_ClearFreeList()PyUnicode_ClearFreeList(): Unicode 自由列表已在 Python 3.3 ä¸è¢«ç§»é™¤ã€‚
移除了
_PyUnicode_ClearStaticStrings()函数。 (由 Victor Stinner 在 bpo-39465 ä¸è´¡çŒ®ã€‚)移除了
Py_UNICODE_MATCH。 它已被 PEP 393 所弃用,并自 Python 3.3 èµ·ä¸�å†�å�¯ç”¨ã€‚ å�¯ä»¥æ”¹ç”¨PyUnicode_Tailmatch()函数。 (由 Inada Naoki 在 bpo-36346 ä¸è´¡çŒ®ã€‚)清除了已定义但未实现的接å�£çš„头文件。 被移除了公共 API 符å�·æœ‰:
_PyBytes_InsertThousandsGroupingLocale,_PyBytes_InsertThousandsGrouping,_Py_InitializeFromArgs,_Py_InitializeFromWideArgs,_PyFloat_Repr,_PyFloat_Digits,_PyFloat_DigitsInit,PyFrame_ExtendStack,_PyAIterWrapper_Type,PyNullImporter_Type,PyCmpWrapper_Type,PySortWrapper_Type,PyNoArgsFunction。 (由 Pablo Galindo Salgado 在 bpo-39372 ä¸è´¡çŒ®ã€‚)
Python 3.9.1 ä¸çš„é‡�è¦�å�˜åŒ–¶
typing¶
typing.Literal 的行为被改为�循 PEP 586 并匹�该 PEP 所�述的��类型检查器的行为。
Literal现在将是去é‡�å¤�的形å�‚。Literalå¯¹è±¡é—´çš„ç›¸ç‰æ€§æ¯”较现在将是顺åº�æ— å…³çš„ã€‚Literal比较现在会考虑类型。 例如Literal[0] == Literal[False]之å‰�的结果值为True。 现在则为False。 为支æŒ�æ¤æ”¹å�˜ï¼Œå†…部使用的类型缓å˜çŽ°åœ¨ä¹Ÿæ”¯æŒ�区分类型。现在如果有任何一个å�‚æ•°ä¸�为 hashable,
Literalå¯¹è±¡å°†åœ¨ç›¸ç‰æ€§æ¯”较期间引å�‘TypeError。 请注æ„�使用å�¯å�˜å�‚数声明Literalå°†ä¸�会抛出异常:>>> from typing import Literal >>> Literal[{0}] >>> Literal[{0}] == Literal[{False}] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'set'
(由 Yurii Karabas 在 bpo-42345 ä¸è´¡çŒ®ã€‚)
macOS 11.0 (Big Sur) 与 Apple Silicon Mac 支�¶
对于 3.9.1 版�说,Python 现在完全支�在 macOS 11.0 (Big Sur) 和 Apple Silicon Macs (基于 ARM64 架构) 上构建和�行。 现在�供了一个新的通用构建类型 universal2,用于在一组�执行文件上原生支� ARM64 和 Intel 64。 二进制文件现在也�以在当�版本的 macOS 上编译以部署到多�较旧的 macOS 版本上 (已测试 10.9),�时会基于�行时所使用的�作系统版本让�些较新的 OS 功能和选项有�件地�用 ("弱链接") 。
(由 Ronald Oussoren å’Œ Lawrence D'Anna 在 bpo-41100 ä¸è´¡çŒ®ã€‚)
Python 3.9.2 ä¸çš„é‡�è¦�å�˜åŒ–¶
collections.abc¶
现在 collections.abc.Callable 泛型会将类型形å�‚展平,类似于 typing.Callable 当å‰�所å�šçš„é‚£æ ·ã€‚ è¿™æ„�味ç�€ collections.abc.Callable[[int, str], str] çš„ __args__ 将为 (int, str, str);之å‰�则为 ([int, str], str)。 为了å…�许这个改å�˜ï¼Œtypes.GenericAlias 现在å�¯ä»¥è¢«å�类化,并且在抽å�– collections.abc.Callable 类型时将返回一个å�类。 通过 typing.get_args() 或 __args__ 访问å�‚数的代ç �需è¦�考虑到这个改å�˜ã€‚ å¯¹äºŽæ— æ•ˆçš„ collections.abc.Callable å�‚数化形å¼�å�¯èƒ½ä¼šå�‘出 DeprecationWarning,这在 Python 3.9.1 ä¸å�¯èƒ½ä¼šé�™é»˜åœ°ä¼ 递。 这个 DeprecationWarning 将在 Python 3.10 ä¸å�˜ä¸º TypeError。 (由 Ken Jin 在 bpo-42195 ä¸è´¡çŒ®ã€‚)
urllib.parse¶
早先的 Python 版本å…�许使用 ; å’Œ & 作为 urllib.parse.parse_qs() å’Œ urllib.parse.parse_qsl() ä¸ query å½¢å�‚的分隔键。 出于安全考虑,也为了é�µå¾ªæ›´æ–°çš„ W3C 推è��设置,这已被改为å�ªå…�许å�•个分隔键,默认为 &。 这一改å�˜è¿˜ä¼šå½±å“� cgi.parse() å’Œ cgi.parse_multipart() å› ä¸ºå®ƒä»¬åœ¨å†…éƒ¨ä½¿ç”¨äº†å�—å½±å“�的函数。 è¦�了解更多细节,请查看它们å�„自的文档。 (由 Adam Goldschmidt, Senthil Kumaran å’Œ Ken Jin 在 bpo-42967 ä¸è´¡çŒ®ã€‚)
Python 3.9.3 ä¸çš„é‡�è¦�å�˜åŒ–¶
新的安全修æ£å°† ftplib.FTP 的行为改æˆ�当设置被动数æ�®é€šé�“æ—¶ä¸�信任远程æœ�务器所å�‘é€�çš„ IPv4 地å�€ã€‚ 我们会改为é‡�用 ftp æœ�务器的 IP 地å�€ã€‚ 对于需è¦�原先的行为的ä¸�常è§�代ç �ï¼Œè¯·åœ¨ä½ çš„ FTP 实例上将 trust_server_pasv_ipv4_address 属性设为 True。 (å�‚è§� gh-87451。)
Python 3.9.5 ä¸çš„é‡�è¦�å�˜åŒ–¶
urllib.parse¶
在 URL ä¸å˜åœ¨æ�¢è¡Œç¬¦æˆ–制表符å�¯èƒ½ä¼šå¯¼è‡´æŸ�ç§�å½¢å¼�的攻击。 æ ¹æ�®æ›´æ–°äº† RFC 3986 çš„ WHATWG 规范,urllib.parse ä¸çš„è§£æž�器将从 URL ä¸å޻除 ASCII æ�¢è¡Œç¬¦ \n, \r 和制表符 \t 以防æ¢è¿™ç§�攻击。 移除的å—符将由一个新的模å�—层级å�˜é‡� urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE æ�¥æŽ§åˆ¶ã€‚ (å�‚è§� gh-88048。)
3.9.14 ä¸çš„é‡�è¦�安全特性¶
使用å��进制以外的底,如 2(二进制)ã€�4ã€�8(八进制)ã€�16(å��å…进制)ã€�32 以外作为基数在 int å’Œ str 之间进行转æ�¢ï¼Œå¦‚æžœå—符串形å¼�çš„æ•°å—æ•°é‡�超过一个é™�制,会抛出 ValueError,以é�¿å…�å› ç®—æ³•å¤�æ�‚而导致的潜在拒ç»�æœ�务攻击。这是对 CVE-2020-10735 的缓解方案。这个é™�制å�¯ä»¥é€šè¿‡çŽ¯å¢ƒå�˜é‡�ã€�å‘½ä»¤è¡Œæ——æ ‡æˆ– sys API 进行é…�置或ç¦�用。å�‚è§� integer string conversion length limitation 文档。默认é™�制是å—符串形å¼�çš„ 4300 ä½�æ•°å—。
3.9.17 ä¸çš„é‡�è¦�å�˜åŒ–¶
tarfile¶
tarfileä¸çš„æ��å�–方法和shutil.unpack_archive()都新增了 filter å�‚数以å…�许é™�制å�¯èƒ½ä»¤äººæ„�外或å�±é™©çš„ tar ç‰¹æ€§ï¼Œä¾‹å¦‚åœ¨ç›®æ ‡ç›®å½•ä¹‹å¤–åˆ›å»ºæ–‡ä»¶ã€‚ 相关细节å�‚è§� 解压缩过滤器。 在 Python 3.12 ä¸ï¼Œä¸�带 filter å�‚数的用法将显示DeprecationWarning。 在 Python 3.14 ä¸ï¼Œé»˜è®¤å€¼å°†åˆ‡æ�¢ä¸º'data'。 (由 Petr Viktorin 在 PEP 706 ä¸è´¡çŒ®ã€‚)