Python 3.11 有什么新�化¶
- 编者:
Pablo Galindo Salgado
è¿™ç¯‡æ–‡ç« ä»‹ç»�了 Python 3.11 相比 3.10 å¢žåŠ çš„æ–°ç‰¹æ€§ã€‚ Python 3.11 å�‘布于 2022 å¹´ 10 月 24 日。 è¦�了解更详细的信æ�¯ï¼Œå�¯å�‚阅 更新日志。
摘� -- �布�点¶
Python 3.11 的速度比 Python 3.10 å¿« 10-60%。在平å�‡çŠ¶å†µä¸‹ï¼Œåœ¨æ ‡å‡†åŸºå‡†æµ‹è¯•ï¼ˆstandard benchmark suite)ä¸å�¯è§�1.25å€�çš„åŠ é€Ÿæ•ˆæžœã€‚æ›´å¤šç»†èŠ‚è¯·å�‚è§� æ›´å¿«çš„ CPython 一节。
æ–°çš„è¯æ³•特性:
新的内置特性:
æ–°çš„æ ‡å‡†åº“æ¨¡å�—:
解释器的改进:
新增
-P命令行选项以å�ŠPYTHONSAFEPATH环境å�˜é‡�æ�¥ ç¦�æ¢è‡ªåŠ¨å°†æ½œåœ¨çš„ä¸�安全路径å‰�ç½® 到sys.path
æ–°çš„ç±»åž‹æ ‡æ³¨ç‰¹æ€§ï¼š
��的弃用�移除或�制:
PEP 594: è®¸å¤šæ—§æ ‡å‡†åº“æ¨¡å�—已被弃用,并将在 Python 3.13 ä¸ç§»é™¤
新的特性¶
PEP 657:回溯信æ�¯ä¸æ ‡æ³¨æ›´è¯¦ç»†çš„错误ä½�置¶
在打å�°å›žæº¯ä¿¡æ�¯ï¼ˆtraceback)时,解释器现在ä¸�ä»…ä¼šæŒ‡å‡ºé”™è¯¯æ‰€åœ¨è¡Œï¼Œè¿˜ä¼šè¿›ä¸€æ¥æŒ‡å‡ºå¼•å�‘错误的表达å¼�在哪里。例如:
Traceback (most recent call last):
File "distance.py", line 11, in <module>
print(manhattan_distance(p1, p2))
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "distance.py", line 6, in manhattan_distance
return abs(point_1.x - point_2.x) + abs(point_1.y - point_2.y)
^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'x'
å…ˆå‰�版本的解释器å�ªä¼šæŒ‡å‡ºè¯¥è¡Œå˜åœ¨é”™è¯¯ï¼Œæˆ‘们ä¸�清楚哪个对象是这里的 None。在深度嵌套的 dict 对象以å�Šè¿žç”¨å¤šä¸ªå‡½æ•°è°ƒç”¨çš„场景下,这些增强的错误也会大有裨益:
Traceback (most recent call last):
File "query.py", line 37, in <module>
magic_arithmetic('foo')
File "query.py", line 18, in magic_arithmetic
return add_counts(x) / 25
^^^^^^^^^^^^^
File "query.py", line 24, in add_counts
return 25 + query_user(user1) + query_user(user2)
^^^^^^^^^^^^^^^^^
File "query.py", line 32, in query_user
return 1 + query_count(db, response['a']['b']['c']['user'], retry=True)
~~~~~~~~~~~~~~~~~~^^^^^
TypeError: 'NoneType' object is not subscriptable
在å¤�æ�‚的算数表达å¼�ä¸å�Œæ ·æœ‰ç”¨ï¼š
Traceback (most recent call last):
File "calculation.py", line 54, in <module>
result = (x / y / z) * (a / b / c)
~~~~~~^~~
ZeroDivisionError: division by zero
æ¤å¤–,增强的回溯信æ�¯åŠŸèƒ½ä½¿ç”¨çš„ä¿¡æ�¯é€šè¿‡é€šç”¨ API æ��供,该 API å�¯ç”¨äºŽå°† bytecode 指令 与æº�代ç �ä½�置相关è�”。 å�¯ä»¥ä½¿ç”¨ä»¥ä¸‹æ–¹å¼�获å�–æ¤ä¿¡æ�¯ï¼š
Python ä¸çš„
codeobject.co_positions()方法。C API ä¸çš„
PyCode_Addr2Location()函数。
更多细节请å�‚è§� PEP 657。(由Pablo Galindoã€�Batuhan Taskaya å’Œ Ammar Askar 在 bpo-43950 ä¸è´¡çŒ®ï¼‰
备注
该特性需è¦�在 代ç �对象 ä¸å˜å‚¨åˆ—ä½�置,这å�¯èƒ½ä¼šå¯¼è‡´è§£é‡Šå™¨å†…å˜å� 用和ç»�过编译的 Python 文件的文件大å°�ç•¥æœ‰å¢žåŠ ã€‚ è¦�é�¿å…�å˜å‚¨é¢�外的信æ�¯å�Œæ—¶å�–消打å�°é¢�外的回溯信æ�¯ï¼Œè¯·ä½¿ç”¨ -X no_debug_ranges 命令行选项或 PYTHONNODEBUGRANGES 环境å�˜é‡�。
PEP 654:异常组与 except*¶
PEP 654 引入了若干è¯è¨€ç‰¹æ€§ï¼Œä»Žè€Œè®©ç¨‹åº�能够å�Œæ—¶å¼•å�‘和处ç�†å¤šä¸ªä¸�相关的异常。内置类型 ExceptionGroup å’Œ BaseExceptionGroup 使得将异常划分æˆ�组并一起引å�‘æˆ�为å�¯èƒ½ï¼Œæ–°æ·»åŠ çš„ except* 是对 except çš„æ³›åŒ–è¯æ³•ï¼Œè¿™ä¸€è¯æ³•能够匹é…�异常组的å�组。
更多细节请�� PEP 654。
(由 Irit Katriel 在 bpo-45292 ä¸è´¡çŒ®ï¼ŒPEP ç”± Irit Katrielã€�Yury Selivanov å’Œ Guido van Rossum 编写)
PEP 678:�用注释丰富异常¶
add_note() æ–¹æ³•å·²è¢«æ·»åŠ åˆ° BaseException ä¸ã€‚如果å˜åœ¨å¼•å�‘异常时ä¸�å�¯ç”¨çš„上下文信æ�¯ï¼Œä½¿ç”¨è¯¥æ–¹æ³•å�¯ä»¥æ‰‹åŠ¨é™„åŠ è¿™äº›ä¿¡æ�¯æ�¥ä¸°å¯Œå¼‚å¸¸ã€‚æ·»åŠ çš„å¤‡æ³¨ä¼šæ˜¾ç¤ºåœ¨é»˜è®¤çš„å›žæº¯ä¿¡æ�¯ä¸ã€‚
更多细节请�� PEP 678。
(由 Irit Katriel 在 bpo-45607 ä¸è´¡çŒ®ï¼ŒPEP ç”± Zac Hatfield-Dodds 编写)
Windows 下的 py.exe �动器改进¶
包括在 Python 3.11 ä¸çš„ 适用于Windowsçš„Pythonå�¯åЍ噍 的副本已进行了é‡�大更新。 现在它支æŒ� PEP 514 所定义的 company/tag è¯æ³•å�³ä½¿ç”¨ -V:<company>/<tag> å�‚数代替å�—é™�çš„ -<major>.<minor>。 è¿™å…�许å�¯åŠ¨æ‰˜ç®¡åœ¨ python.org 上的 PythonCore 以外的其他å�‘行版。
当使用 -V: 选择器时,å�¯ä»¥çœ�ç•¥ company 或 tagï¼Œæ¤æ—¶ä¼šæ�œç´¢æ‰€æœ‰çš„安装。例如,-V:OtherPython/ 会选择 OtherPython 所注册的“最佳â€�æ ‡ç¾ï¼Œè€Œ -V:3.11 或 -V:/3.11 åˆ™ä¼šé€‰æ‹©æ ‡ç¾ä¸º 3.11 的“最佳â€�å�‘行版。
在使用旧å¼�çš„ -<major>ã€�-<major>.<minor>ã€�-<major>-<bitness> 或 -<major>.<minor>-<bitness> å�‚数时,应ä¿�留过去版本的所有已有行为,并å�ªé€‰æ‹©ä»Ž PythonCore å�‘布的版本。 ä¸�过,-64 å�Žç¼€çŽ°åœ¨è¡¨ç¤ºâ€œé�ž 32 ä½�â€�(ä¸�一定是 x86-64ï¼‰ï¼Œå› ä¸ºæœ‰å¤šç§�å�—支æŒ�çš„ 64 ä½�å¹³å�°ã€‚ 32 ä½�è¿�行时是通过检查è¿�è¡Œæ—¶çš„æ ‡ç¾æ˜¯å�¦æœ‰ -32 å�Žç¼€æ�¥æ£€æµ‹çš„。 自 Python 3.5 以æ�¥çš„æ‰€æœ‰ç‰ˆæœ¬éƒ½åœ¨å…¶ 32 ä½�编译ä¸åŒ…括了这个å�Žç¼€ã€‚
å…¶ä»–è¯è¨€ç‰¹æ€§ä¿®æ”¹Â¶
星�解包表达�现在�以在
forè¯å�¥ä¸ä½¿ç”¨ã€‚(更多细节请å�‚è§� bpo-46725)现在,在 异æ¥å‡½æ•° ä¸çš„æŽ¨å¯¼å¼�内部å…�è®¸ä½¿ç”¨å¼‚æ¥ æŽ¨å¯¼å¼�ã€‚æ¤æ—¶ï¼Œå¤–部推导å¼�éš�å¼�地å�˜æˆ�äº†å¼‚æ¥æŽ¨å¯¼å¼�。(由 Serhiy Storchaka 在 bpo-33346 ä¸è´¡çŒ®ï¼‰
在
withè¯å�¥å’Œç”¨äºŽä¸�支æŒ� context manager å��议的对象contextlib.ExitStack.enter_context()ä¸ï¼Œä»¥å�Šasync withè¯å�¥å’Œç”¨äºŽä¸�支æŒ� asynchronous context manager å��议的对象的contextlib.AsyncExitStack.enter_async_context()ä¸çŽ°åœ¨ä¼šå¼•å�‘TypeError而ä¸�是AttributeError。 (由 Serhiy Storchaka 在 bpo-12022 å’Œ bpo-44471 ä¸è´¡çŒ®ã€‚ï¼‰å¢žåŠ äº†
object.__getstate__(),它æ��ä¾›__getstate__()方法的默认实现。copyå¹¶pickle内置类型bytearray,set,frozenset,collections.OrderedDict,collections.deque,weakref.WeakSetå’Œdatetime.tzinfoçš„å�类的实例现在将会拷è´�å¹¶å°�å˜è¢«å®žçŽ°ä¸º æ§½ä½� 的实例属性。 æ¤é¡¹æ”¹å�˜æœ‰ä¸€ä¸ªæ„�外的附带影å“�:它将扰乱少数ä¸�使用object.__getstate__()的现有 Python 项目。 请å�‚阅 gh-70766 上近期的评论了解有关æ¤ç±»ä»£ç �所需处ç�†çš„讨论。 (由 Serhiy Storchaka 在 bpo-26579 ä¸è´¡çŒ®ã€‚)
å¢žåŠ äº†
-P命令行选项和PYTHONSAFEPATH环境å�˜é‡�,它们将ç¦�用当è¿�行脚本时将脚本目录,或者当使用-cå’Œ-m时将当å‰�ç›®å‰�è‡ªåŠ¨æ·»åŠ åˆ°sys.path。 è¿™å�¯ä»¥ç¡®ä¿�å�ªæœ‰æ ‡å‡†åº“和已安装模å�—å�¯é€šè¿‡import导入,而é�¿å…�æ— æ„�或æ�¶æ„�地使用本地(且通常为用户å�¯å†™ï¼‰çš„目录å±�蔽æ¤ç±»æ¨¡å�—。 (由 Victor Stinner 在 gh-57684 ä¸è´¡çŒ®ã€‚)在 æ ¼å¼�è§„æ ¼è¿·ä½ è¯è¨€ ä¸å¢žåŠ äº†ä¸€ä¸ª
"z"选项用æ�¥åœ¨èˆ�å…¥åˆ°æ ¼å¼�精度å�Žå¼ºåˆ¶å°†è´Ÿæ•°è½¬ä¸ºæ£æ•°ã€‚ 请å�‚阅 PEP 682 了解详情。 (由 John Belmonte 在 gh-90153 ä¸è´¡çŒ®ã€‚)sys.pathä¸�å†�接å�—å—节串。对æ¤çš„æ”¯æŒ�在 Python 3.2 å’Œ 3.6 之间䏿–过一段时间,但是直到 Python 3.10.0 å�‘布时æ‰�被人å�‘现。æ¤å¤–,由于-bå’Œsys.path_importer_cache之间的交互,当å�Œæ—¶å˜åœ¨strå’Œbytes键时,æ�¢å¤�对æ¤çš„æ”¯æŒ�会很困难。(由 Thomas Grainger 在 gh-91181 ä¸è´¡çŒ®ï¼‰
其他 CPython 实现的改�¶
实现了用于
complexçš„__complex__()和用于bytesçš„__bytes__()特殊方法以支æŒ�typing.SupportsComplexå’Œtyping.SupportsByteså��议。 (由 Mark Dickinson å’Œ Donghee Na 在 bpo-24234 ä¸è´¡çŒ®ã€‚ï¼‰æ·»åŠ äº†æ–°çš„å†…éƒ¨å“ˆå¸Œç®—æ³•
siphash13。它与siphash24有类似的安全特性,但是对于长输入,它的速度略快。strã€�bytes和其他一些类型现在使用它作为hash()的默认算法。PEP 552 基于哈希的 .pyc 文件 现在也使用siphash13。(由 Inada Naoki 在 bpo-29410 ä¸è´¡çŒ®ï¼‰å½“使用没有å�‚æ•°çš„
raiseè¯å�¥é‡�新引å�‘æ´»åŠ¨çš„å¼‚å¸¸æ—¶ï¼Œè¢«é™„åŠ åœ¨æ¤å¼‚常上的回溯现在始终为sys.exc_info()[1].__traceback__。这æ„�味ç�€åœ¨å½“å‰�exceptå�å�¥ä¸å¯¹å›žæº¯çš„修改将被å��æ˜ åˆ°é‡�新引å�‘的异常。(由 Irit Katriel 在 bpo-45711 ä¸è´¡çŒ®ï¼‰è§£é‡Šå™¨çжæ€�对已处ç�†å¼‚常(å�ˆå��
exc_info或_PyErr_StackItem)的表示现在å�ªæœ‰exc_valueå—æ®µï¼›exc_typeå’Œexc_tracebackå·²è¢«ç§»é™¤ï¼Œå› ä¸ºå®ƒä»¬å�¯ä»¥æ´¾ç”Ÿè‡ªexc_value。(由 Irit Katriel 在 bpo-45711 ä¸è´¡çŒ®ï¼‰WIndows 安装程åº�æ·»åŠ äº†ä¸€ä¸ªæ–°çš„ 命令行选项
AppendPath。它的行为类似于PrependPathï¼Œä½†æ˜¯ä¼šè¿½åŠ å®‰è£…å’Œè„šæœ¬ç›®å½•è€Œä¸�是å‰�åŠ ã€‚ï¼ˆç”± Bastian Neuburger 在 bpo-44934 ä¸è´¡çŒ®ï¼‰ä¸ºäº†ä½¿ç”¨
PyConfig.module_search_pathsåˆ�始化sys.path,PyConfig.module_search_paths_setå—æ®µçŽ°åœ¨å¿…é¡»ä½¿ç”¨``1`` 作åˆ�始化,å�¦åˆ™ï¼Œè¯¥åˆ�始化行为会é‡�新计算路径并替æ�¢ä»»ä½•åŠ å…¥åˆ°module_search_paths的值。--help选项的输出现在将适应于50行/80列。有关 Python environment variables å’Œ-X选项的信æ�¯å�¯ä»¥åˆ†åˆ«ä½¿ç”¨--help-envå’Œ--help-xoptionsæ ‡å¿—èŽ·å¾—ï¼Œå¹¶å�¯ä»¥ä½¿ç”¨æ–°çš„æ ‡å¿—--help-all。(由 Éric Araujo 在 bpo-46142 贡献。)使用å��进制以外的底,如 2(二进制)ã€�4ã€�8(八进制)ã€�16(å��å…进制)ã€�32 以外作为基数在
intå’Œstr之间进行转æ�¢ï¼Œå¦‚æžœå—符串形å¼�çš„æ•°å—æ•°é‡�超过一个é™�制,会抛出ValueError,以é�¿å…�å› ç®—æ³•å¤�æ�‚而导致的潜在拒ç»�æœ�务攻击。这是对 CVE-2020-10735 的缓解方案。这个é™�制å�¯ä»¥é€šè¿‡çŽ¯å¢ƒå�˜é‡�ã€�å‘½ä»¤è¡Œæ——æ ‡æˆ–sysAPI 进行é…�置或ç¦�用。å�‚è§� integer string conversion length limitation 文档。默认é™�制是å—符串形å¼�çš„ 4300 ä½�æ•°å—。
新增模�¶
改进的模�¶
asyncio¶
æ·»åŠ äº†
TaskGroup类,它是一个 异æ¥ä¸Šä¸‹æ–‡ç®¡ç�†å™¨ï¼Œå�¯ä»¥æŒ�有一组任务,ç‰å¾…它们全部完æˆ�å�Žæ‰�退出。 对于新代ç �,建议使用æ¤ç±»ï¼Œè€Œä¸�是直接使用create_task()å’Œgather()。 (由 Yury Selivanov ç‰äººåœ¨ gh-90908 ä¸è´¡çŒ®ã€‚ï¼‰å¢žåŠ äº†
timeout()ï¼Œä¸€ä¸ªç”¨äºŽåœ¨å¼‚æ¥æ“�作上设置超时的异æ¥ä¸Šä¸‹æ–‡ç®¡ç�†å™¨ã€‚ 对于新代ç �推è��用这个æ�¥ä»£æ›¿ç›´æŽ¥ä½¿ç”¨wait_for()。 (由 Andrew Svetlov 在 gh-90927 ä¸è´¡çŒ®ï¼‰å¢žåŠ äº†
Runner类,该类对外公开了run()所使用的机制。 (由 Andrew Svetlov 在 gh-91218 ä¸è´¡çŒ®ã€‚).)为 asyncio 库ä¸çš„å�Œæ¥åŒ–åŽŸè¯æ·»åŠ äº†
Barrier类,以å�Šç›¸åº”çš„BrokenBarrierError异常。 (由 Yves Duprat å’Œ Andrew Svetlov 在 gh-87518 ä¸è´¡çŒ®ã€‚)å�‘
asyncio.loop.create_connection()æ·»åŠ äº†å…³é”®å—å�‚æ•° all_errors 以便å�¯ä»¥å°†å¤šä¸ªè¿žæŽ¥é”™è¯¯ä½œä¸ºä¸€ä¸ªExceptionGroupæ�¥å¼•å�‘ã€‚å¢žåŠ äº†
asyncio.StreamWriter.start_tls()方法用于将现有的基于æµ�的连接å�‡çº§ä¸º TLS。 (由 Ian Good 在 bpo-34975 ä¸è´¡çŒ®ã€‚ï¼‰ä¸ºäº‹ä»¶å¾ªçŽ¯æ·»åŠ äº†åŽŸå§‹æ•°æ�®æŠ¥å¥—接å—函数:
sock_sendto(),sock_recvfrom()å’Œsock_recvfrom_into()。 这些函数在SelectorEventLoopå’ŒProactorEventLoopä¸å�‡æœ‰å®žçŽ°ã€‚ (由 Alex Grönholm 在 bpo-46805 ä¸è´¡çŒ®ã€‚).)为
Taskæ·»åŠ äº†cancelling()å’Œuncancel()方法。 它们主è¦�供内部使用,特别是TaskGroup。
contextlib¶
dataclasses¶
datetime¶
å¢žåŠ äº†
datetime.UTC,是datetime.timezone.utc的便æ�·åˆ«å��。 (由 Kabir Kwatra 在 gh-91973 ä¸è´¡çŒ®ã€‚)datetime.date.fromisoformat(),datetime.time.fromisoformat()å’Œdatetime.datetime.fromisoformat()现在å�¯ä»¥è¢«ç”¨æ�¥è§£æž�大多数 ISO 8601 æ ¼å¼�(除了那些支æŒ�分数å°�æ—¶å’Œåˆ†é’Ÿçš„æ ¼å¼�)。 (由 Paul Ganssle 在 gh-80010 ä¸è´¡çŒ®ã€‚)
enum¶
å°†
EnumMetaé‡�命å��为EnumType(EnumMeta作为别å��ä¿�ç•™)ã€‚å¢žåŠ äº†
StrEnum,其æˆ�员å�¯ä»¥ï¼ˆä¸”必须)作为å—ç¬¦ä¸²ä½¿ç”¨ã€‚å¢žåŠ äº†
ReprEnum,它å�ªæ˜¯åœ¨ä¸º__str__()å’Œ__format__()方法(供str(),format()å’Œ f-string 使用)返回æˆ�员的å—é�¢å€¼ï¼ˆè€Œä¸�是å��称)时修改了它们的__repr__()。修改了
Enum.__format__()(为format(),str.format()å’Œ f-string 的默认值) 以便始终产生于Enum.__str__()相å�Œçš„结果:对于继承自ReprEnum的枚举它将æˆ�为其æˆ�员的值;对于所有其他枚举它将为枚举和æˆ�员å��ç§° (例如Color.RED)。将新的 boundary 类形å�‚连å�Œå…¶é€‰é¡¹æ·»åŠ åˆ°
Flag枚举和FlagBoundary枚举ä¸ï¼Œä»¥æŽ§åˆ¶è¶…èŒƒå›´æ——æ ‡å€¼çš„å¤„ç�†æ–¹å¼�ã€‚å¢žåŠ äº†
verify()枚举装饰器和EnumCheck枚举å�Šå…¶é€‰é¡¹ï¼Œä»¥åŸºäºŽç‰¹å®šçº¦æ�Ÿæ�¡ä»¶æ�¥æ£€æŸ¥æžšä¸¾ç±»ã€‚å¢žåŠ äº†
member()å’Œnonmember()装饰器,用于确ä¿�被装饰的对象是/å�¦ä¼šè¢«è½¬æ�¢ä¸ºæžšä¸¾æˆ�å‘˜ã€‚å¢žåŠ äº†
property()装饰器,它类似于property()但是专门针对枚举。 请使用它æ�¥ä»£æ›¿types.DynamicClassAttribute()ã€‚å¢žåŠ äº†
global_enum()枚举装饰器,它会调整__repr__()和__str__()以将值显示为其模�的�员而�是枚举类的�员。 例如,'re.ASCII'是re.RegexFlag的ASCII�员而�是'RegexFlag.ASCII'。增强了
Flag以支æŒ�针对其æˆ�员的len(),è¿ä»£å’Œin/not in。 例如,现在å�¯ä»¥ä½¿ç”¨ä¸‹é�¢çš„代ç �:len(AFlag(3)) == 2 and list(AFlag(3)) == (AFlag.ONE, AFlag.TWO)修改了
Enumå’ŒFlag使得æˆ�员的定义是在__init_subclass__()被调用之å‰�ï¼›dir()现在将包括æ�¥è‡ªæ··å…¥æ•°æ�®ç±»åž‹çš„æ–¹æ³•ç‰ã€‚å°†
Flag修改为å�ªè€ƒè™‘规范的基本值(å�³äºŒçš„乘方)而å¤�å�ˆå€¼ï¼ˆå¦‚3,6,10ç‰ï¼‰åˆ™è¢«è§†ä¸ºåˆ«å��;逆å�‘æ——æ ‡å°†è¢«å¼ºåˆ¶è½¬æ�¢ä¸ºå¯¹åº”çš„æ£å�‘æ——æ ‡ã€‚
fcntl¶
在 FreeBSD 上,
F_DUP2FDå’ŒF_DUP2FD_CLOEXECæ——æ ‡åˆ†åˆ«å�—到支æŒ�,å‰�者ç‰ä»·äºŽdup2用法而å�Žè€…é¢�外设置了FD_CLOEXECæ——æ ‡ã€‚
fractions¶
functools¶
functools.singledispatch()现在支æŒ�以types.UnionTypeå’Œtyping.Union作为 dispatch å�‚æ•°çš„æ ‡æ³¨ã€‚:>>> from functools import singledispatch >>> @singledispatch ... def fun(arg, verbose=False): ... if verbose: ... print("Let me just say,", end=" ") ... print(arg) ... >>> @fun.register ... def _(arg: int | float, verbose=False): ... if verbose: ... print("Strength in numbers, eh?", end=" ") ... print(arg) ... >>> from typing import Union >>> @fun.register ... def _(arg: Union[list, set], verbose=False): ... if verbose: ... print("Enumerate this:") ... for i, elem in enumerate(arg): ... print(i, elem) ...
(由 Yurii Karabas 在 bpo-46014 ä¸è´¡çŒ®ã€‚)
hashlib¶
hashlib.blake2b()å’Œhashlib.blake2s()现在将优先使用 libb2 而ä¸�是 Python 自带的副本。 (由 Christian Heimes 在 bpo-47095 ä¸è´¡çŒ®ã€‚)包å�« SHA3 å’Œ SHAKE 的内部
_sha3模å�—现在会使用 tiny_sha3 而ä¸�是 Keccak Code Package æ�¥å‡�å°�代ç �和二进制文件的大å°�。hashlib模å�—将首选æ�¥è‡ª OpenSSL 的优化版 SHA3 å’Œ SHAKE 实现。 这个改å�˜å°†å�ªå½±å“�ä¸�带 OpenSSL 支æŒ�的安装版。 (由 Christian Heimes 在 bpo-47098 ä¸è´¡çŒ®ã€‚ï¼‰å¢žåŠ äº†
hashlib.file_digest(),一个针对文件或文件型对象高效哈希è¿�算的辅助函数。 (由 Christian Heimes 在 gh-89313 ä¸è´¡çŒ®ã€‚)
IDLE 与 idlelib¶
inspect¶
å¢žåŠ äº†
getmembers_static()用于返回所有æˆ�员而ä¸�通过æ��述器å��议触å�‘动æ€�查找。 (由 Weipeng Hong 在 bpo-30533 ä¸è´¡çŒ®ã€‚ï¼‰å¢žåŠ äº†
ismethodwrapper()用于检查æŸ�个对象的类型是å�¦ä¸ºMethodWrapperType。 (由 Hakan Çelik 在 bpo-29418 ä¸è´¡çŒ®ã€‚)修改了
inspect模å�—ä¸ä¸Žå¸§ç›¸å…³çš„函数以返回新的FrameInfoå’ŒTraceback类实例(与之å‰�çš„ named tuple é£Žæ ¼çš„æŽ¥å�£ä¿�æŒ�å�‘下兼容),它们包括扩展的 PEP 657 ä½�置信æ�¯ï¼ˆæœ«å°¾è¡Œç¼–å�·ï¼Œåˆ—与结æ�Ÿåˆ—ç‰ï¼‰ã€‚ å�—å½±å“�的函数有:(由 Pablo Galindo 在 gh-88116 ä¸è´¡çŒ®ã€‚)
locale¶
å¢žåŠ äº†
locale.getencoding()以获å�–当å‰�è¯è¨€åŒºåŸŸç¼–ç �æ ¼å¼�。 它类似于locale.getpreferredencoding(False)但会忽略 Python UTF-8 模å¼�。
logging¶
å¢žåŠ äº†
getLevelNamesMapping()以返回一个从日志记录级别å��ç§° (例如'CRITICAL') 到其对应 日志级别 值 (例如默认值50) çš„æ˜ å°„ã€‚ (由 Andrei Kulakovin 在 gh-88024 ä¸è´¡çŒ®ã€‚)å�‘
SysLogHandlerå¢žåŠ äº†createSocket()方法以匹é…�SocketHandler.createSocket()。 它将在处ç�†å�¥æŸ„åˆ�始化期间以å�Šå�‘出事件时被自动调用,如果没有已激活的套接å—çš„è¯�。 (由 Kirill Pinchuk 在 gh-88457 ä¸è´¡çŒ®ã€‚)
math¶
å¢žåŠ äº†
math.exp2(): 返回 2 çš„ x 次幂。 (由 Gideon Mitchell 在 bpo-45917 ä¸è´¡çŒ®ã€‚ï¼‰å¢žåŠ äº†
math.cbrt(): 返回 x çš„ç«‹æ–¹æ ¹ã€‚ (由 Ajith Ramachandran 在 bpo-44357 ä¸è´¡çŒ®ã€‚)两个
math.pow()边界情况的行为已改å�˜ï¼Œä»¥ä¾¿ä¸Ž IEEE 754 规范ä¿�æŒ�一致。math.pow(0.0, -math.inf)å’Œmath.pow(-0.0, -math.inf)ç‰è¿�算现在将返回inf。 在æ¤ä¹‹å‰�它们会引å�‘ValueError。 (由 Mark Dickinson 在 bpo-44339 ä¸è´¡çŒ®ã€‚)现在
math.nan值将总是å�¯ç”¨ã€‚ (由 Victor Stinner 在 bpo-46917 ä¸è´¡çŒ®ã€‚)
operator¶
å¢žåŠ äº†ä¸€ä¸ªæ–°å‡½æ•°
operator.call,使得operator.call(obj, *args, **kwargs) == obj(*args, **kwargs)。 (由 Antony Lee 在 bpo-44019 ä¸è´¡çŒ®ã€‚)
os¶
在 Windows 上,
os.urandom()现在将使用BCryptGenRandom(),而ä¸�是已被弃用的CryptGenRandom()。 (由 Donghee Na 在 bpo-44611 ä¸è´¡çŒ®ã€‚)
pathlib¶
re¶
æ£åˆ™è¡¨è¾¾å¼�现已支æŒ�原å�化分组 (
(?>...)) å’Œå� 有型数é‡�é™�定符 (*+,++,?+,{m,n}+)。 (由 Jeffrey C. Jacobs å’Œ Serhiy Storchaka 在 bpo-433030 ä¸è´¡çŒ®ã€‚)
shutil¶
在
shutil.rmtree()䏿·»åŠ äº†å�¯é€‰å½¢å�‚ dir_fd。 (由 Serhiy Storchaka 在 bpo-46245 ä¸è´¡çŒ®ã€‚)
socket¶
为 NetBSD æ·»åŠ äº† CAN Socket 支æŒ�。 (由 Thomas Klausner 在 bpo-30512 ä¸è´¡çŒ®ã€‚)
create_connection()具有一个在连接失败的情况下引å�‘包å�«æ‰€æœ‰é”™è¯¯è€Œçš„ExceptionGroupä¸�是å�ªå¼•å�‘最å�Žçš„错误的选项。 (由 Irit Katriel 在 bpo-29980 ä¸è´¡çŒ®ã€‚)
sqlite3¶
ä½ çŽ°åœ¨å�¯ä»¥é€šè¿‡å°†
Noneä¼ ç»™set_authorizer()æ�¥ç¦�用身份验è¯�。 (由 Erlend E. Aasland 在 bpo-44491 ä¸è´¡çŒ®ã€‚)排åº�å��
create_collation()现在å�¯ä»¥åŒ…å�«ä»»æ„� Unicode å—符。 å¸¦æœ‰æ— æ•ˆå—符的排åº�å��现在将引å�‘UnicodeEncodeError而ä¸�是sqlite3.ProgrammingError。 (由 Erlend E. Aasland 在 bpo-44688 ä¸è´¡çŒ®ã€‚)现在
sqlite3异常包括以sqlite_errorcode代表的 SQLite 扩展错误ç �和以sqlite_errorname代表的 SQLite 错误å��。 (由 Aviv Palivoda, Daniel Shahaf å’Œ Erlend E. Aasland 在 bpo-16379 å’Œ bpo-24139 ä¸è´¡çŒ®ã€‚)å�‘
sqlite3.Connectionæ·»åŠ äº†setlimit()å’Œgetlimit()用于在连接上设置和获å�– SQLite é™�制。 (由 Erlend E. Aasland 在 bpo-45243 ä¸è´¡çŒ®ã€‚)现在
sqlite3会基于兼容底层 SQLite 库的默认线程模å¼�æ�¥è®¾ç½®sqlite3.threadsafety。 (由 Erlend E. Aasland 在 bpo-45613 ä¸è´¡çŒ®ã€‚)现在
sqlite3C 回调会在å�¯ç”¨äº†å›žè°ƒå›žæº¯çš„æƒ…况下使用ä¸�å�¯å¼•å�‘的异常。 用户现在å�¯ä»¥æ³¨å†Œä¸�å�¯å¼•å�‘的钩å�处ç�†å�¥æŸ„æ�¥æ��å�‡å…¶è°ƒè¯•体验。 (由 Erlend E. Aasland 在 bpo-45828 ä¸è´¡çŒ®ã€‚)跨回滚的获å�–ä¸�会å†�引å�‘
InterfaceError。 而是改为由 SQLite 库æ�¥å¤„ç�†è¿™ç±»æƒ…况。 (由 Erlend E. Aasland 在 bpo-44092 ä¸è´¡çŒ®ã€‚)å�‘
sqlite3.Connectionæ·»åŠ äº†serialize()å’Œdeserialize()用于åº�列化和å��åº�列化数æ�®åº“。 (由 Erlend E. Aasland 在 bpo-41930 ä¸è´¡çŒ®ã€‚)å�‘
sqlite3.Connectionæ·»åŠ äº†create_window_function()用于创建è�šå�ˆçª—å�£å‡½æ•°ã€‚ (由 Erlend E. Aasland 在 bpo-34916 ä¸è´¡çŒ®ã€‚)å�‘
sqlite3.Connectionæ·»åŠ äº†blobopen()。sqlite3.Blobå…�许对 blob 进行增é‡� I/O æ“�作。 (由 Aviv Palivoda å’Œ Erlend E. Aasland 在 bpo-24905 ä¸è´¡çŒ®ã€‚)
string¶
�
string.Templateæ·»åŠ äº†get_identifiers()å’Œis_valid(),它们分别返回全部的有效å� ä½�符,以å�Šæ˜¯å�¦å˜åœ¨æ— 效å� ä½�符。 (由 Ben Kehoe 在 gh-90465 ä¸è´¡çŒ®ã€‚)
sys¶
sys.exc_info()çš„typeå’Œtracebackå—æ®µçŽ°åœ¨æ˜¯æ´¾ç”Ÿè‡ªvalue(异常实例)ï¼Œå› æ¤å½“一个异常在处ç�†æœŸé—´è¢«ä¿®æ”¹æ—¶ï¼Œå…¶å�˜åŒ–会在å�Žç»å¯¹exc_info()的调用结果ä¸å��æ˜ å‡ºæ�¥ã€‚ (由 Irit Katriel 在 bpo-45711 ä¸è´¡çŒ®ã€‚ï¼‰å¢žåŠ äº†è¿”å›žæ¿€æ´»çš„å¼‚å¸¸å®žä¾‹çš„
sys.exception()(ç‰ä»·äºŽsys.exc_info()[1])。 (由 Irit Katriel 在 bpo-46328 ä¸è´¡çŒ®ã€‚ï¼‰å¢žåŠ äº†
sys.flags.safe_pathæ——æ ‡ã€‚ (由 Victor Stinner 在 gh-57684 ä¸è´¡çŒ®ã€‚)
sysconfig¶
å¢žåŠ äº†ä¸‰ä¸ªæ–°çš„ 安装方案 (posix_venv, nt_venv and venv) 并将在 Python 创建新虚拟环境或从虚拟环境è¿�行时使用。 å‰�两个方案 (posix_venv å’Œ nt_venv) 是用于é�ž Windows å’Œ Windows çš„ OS 专属方案,venv å®žé™…ä¸Šæ˜¯æ ¹æ�® Python è¿�行所在的 OS æ�¥ç¡®å®šçš„å‰�两者之一。 这对于è¦�修改
sysconfig.get_preferred_scheme()的下游分å�‘者æ�¥è¯´å¾ˆæœ‰ç”¨å¤„。 创建新虚拟环境的第三方代ç �应当使用新的 venv 安装方案æ�¥ç¡®å®šè·¯å¾„,就åƒ�venv所å�šçš„é‚£æ ·ã€‚ (由 Miro HronÄ�ok 在 bpo-45413 ä¸è´¡çŒ®ã€‚)
tempfile¶
SpooledTemporaryFile对象现在完整实现了io.BufferedIOBase或io.TextIOBase的方法(å�–决于具体文件模å¼�)。 这使它们能æ£ç¡®åœ°é…�å�ˆæŽ¥å�—文件型对象的 API 工作,如压缩文件的模å�—。 (由 Carey Metcalfe 在 gh-70363 ä¸è´¡çŒ®ã€‚)
threading¶
在 Unix 上,如果
sem_clockwait()函数å˜åœ¨äºŽ C åº“ä¸ (å�³glibc 2.30 å�Šæ›´æ–°çš„版本),则threading.Lock.acquire()方法现在将使用å�•调时钟 (time.CLOCK_MONOTONIC) æ�¥è®¡ç®—超时,而ä¸�使用系统时钟 (time.CLOCK_REALTIME),以ä¸�å�—系统时钟修改的影å“�。 (由 Victor Stinner 在 bpo-41710 ä¸è´¡çŒ®ã€‚)
time¶
在 Unix 上,如果有�能,
time.sleep()现在将使用clock_nanosleep()或nanosleep()函数,其精度为 1 纳秒 (10-9 ç§’),而ä¸�是使用精度为 1 微秒 (10-6 ç§’) çš„select()。 (由 Benjamin SzÅ‘ke å’Œ Victor Stinner 在 bpo-21302 ä¸è´¡çŒ®ã€‚)在 Windows 8.1 或更新版本上,现在
time.sleep()会使用一个基于 高精度计时器 çš„å�¯ç‰å¾…计时器,其精度为 100 纳秒 (10-7 ç§’)。 在之å‰�版本ä¸ï¼Œå…¶ç²¾åº¦ä¸º 1 毫秒 (10-3 ç§’)。 (由 Benjamin SzÅ‘ke, Donghee Na, Eryk Sun å’Œ Victor Stinner 在 bpo-21302 å’Œ bpo-45429 ä¸è´¡çŒ®ã€‚)
tkinter¶
å¢žåŠ äº†å°† Tcl 库的准确版本å�·ä½œä¸ºç±»ä¼¼
sys.version_info的命å��元组返回的方法info_patchlevel()。 (由 Serhiy Storchaka 在 gh-91827 ä¸è´¡çŒ®ã€‚)
traceback -- 回溯¶
å¢žåŠ äº†
traceback.StackSummary.format_frame_summary()以å…�许用户é‡�è½½è¦�在回溯ä¸å‡ºçŽ°å“ªäº›å¸§ï¼Œä»¥å�Šè¦�å¦‚ä½•æ ¼å¼�化它们。 (由 Ammar Askar 在 bpo-44569 ä¸è´¡çŒ®ã€‚ï¼‰å¢žåŠ äº†
traceback.TracebackException.print(),该函数å�¯å°†TracebackExceptionå®žä¾‹æ ¼å¼�化打å�°åˆ°ä¸€ä¸ªæ–‡ä»¶ã€‚ (由 Irit Katriel 在 bpo-33809 ä¸è´¡çŒ®ã€‚)
typing¶
主�的�化,请�阅 有关类型�示的新增特性。
å¢žåŠ äº†
typing.assert_never()å’Œtyping.Never。typing.assert_never()适用于è¦�求类型检查器确认æŸ�一行代ç �是ä¸�å�¯è¾¾çš„。 在è¿�行时,它会引å�‘AssertionError。 (由 Jelle Zijlstra 在 gh-90633 ä¸è´¡çŒ®ã€‚ï¼‰å¢žåŠ äº†
typing.reveal_type()。 它适用于让类型检查器推ç�†å‡ºç»™å®šè¡¨è¾¾å¼�的类型。 在è¿�行时它会打å�°æ‰€æŽ¥æ”¶çš„值的类型。 (由 Jelle Zijlstra 在 gh-90572 ä¸è´¡çŒ®ã€‚ï¼‰å¢žåŠ äº†
typing.assert_type()。 它适用于让类型检查器确认推ç�†å‡ºçš„给定表达å¼�的类型与给定的类型相匹é…�。 在è¿�行时它将简å�•地返回所接收的值。 (由 Jelle Zijlstra 在 gh-90638 ä¸è´¡çŒ®ã€‚)现在
typing.TypedDict类型å�¯ä»¥æ˜¯æ³›åž‹ã€‚ (由 Samodya Abeysiriwardane 在 gh-89026 ä¸è´¡çŒ®ã€‚)现在
NamedTuple类型å�¯ä»¥æ˜¯æ³›åž‹ã€‚ (由 Serhiy Storchaka 在 bpo-43923 ä¸è´¡çŒ®ã€‚)å…�许
typing.Anyå�类化。 这适用于é�¿å…�å…³è�”到高度动æ€�类的类型检查器错误,例如 mock 类。 (由 Shantanu Jain 在 gh-91154 ä¸è´¡çŒ®ã€‚)现在
typing.final()装饰器å�¯åœ¨è¢«è£…饰的对象上设置__final__属性。 (由 Jelle Zijlstra 在 gh-90500 ä¸è´¡çŒ®ã€‚)typing.get_overloads()函数å�¯è¢«ç”¨æ�¥å†…çœ�一个函数的é‡�载。typing.clear_overloads()å�¯è¢«ç”¨æ�¥æ¸…ç�†ä¸€ä¸ªå‡½æ•°æ‰€æœ‰çš„é‡�载。 (由 Jelle Zijlstra 在 gh-89263 ä¸è´¡çŒ®ã€‚)现在
Protocolå�类的__init__()方法将被ä¿�留。 (由 Adrian Garcia Badarasco 在 gh-88970 ä¸è´¡çŒ®ã€‚)空元组类型 (
Tuple[()]) 的表示形å¼�已被简化。 这将影å“�内çœ�æ“�作,例如get_args(Tuple[()])现在将被求值为()而ä¸�是((),)。 (由 Serhiy Storchaka 在 gh-91137 ä¸è´¡çŒ®ã€‚)通过移除ç§�有
typing._type_check函数的回调检查放æ�¾äº†ç±»åž‹æ ‡æ³¨çš„è¿�行时è¦�求。 (由 Gregory Beauregard 在 gh-90802 ä¸è´¡çŒ®ã€‚)现在
typing.get_type_hints()支æŒ�å°†å—符串求值为 PEP 585 泛型别å�� ä¸çš„å‰�å�‘引用。 (由 Niklas Rosenstein 在 gh-85542 ä¸è´¡çŒ®ã€‚)typing.get_type_hints()å°†ä¸�å†�æ·»åŠOptional到形å�‚并以None作为默认值。 (由 Nikita Sobolev 在 gh-90353 ä¸è´¡çŒ®ã€‚)现在
typing.get_type_hints()支æŒ�与纯å—符串化的ClassVaræ ‡æ³¨è¿›è¡Œæ±‚å€¼ã€‚ (由 Gregory Beauregard 在 gh-90711 ä¸è´¡çŒ®ã€‚)typing.no_type_check()å°†ä¸�å†�修改外部类和函数。 现在它还会æ£ç¡®åœ°å°†ç±»æ–¹æ³•æ ‡è®°ä¸ºä¸�进行类型检查。 (由 Nikita Sobolev 在 gh-90729 ä¸è´¡çŒ®ã€‚)
unicodedata¶
Unicode æ•°æ�®åº“已更新到 14.0.0 版。 (由 Benjamin Peterson 在 bpo-45190 ä¸è´¡çŒ®ã€‚)
unittest¶
å¢žåŠ äº†
TestCase类的enterContext()å’ŒenterClassContext()方法,IsolatedAsyncioTestCase类的enterAsyncContext()方法和unittest.enterModuleContext()函数。 (由 Serhiy Storchaka 在 bpo-45046 ä¸è´¡çŒ®ã€‚)
venv¶
当新的 Python 虚拟环境被创建时,将使用 venv sysconfig 安装方案 æ�¥ç¡®å®šçŽ¯å¢ƒå†…éƒ¨çš„è·¯å¾„ã€‚ 当 Python 在虚拟环境ä¸è¿�行时,å�Œä¸€ä¸ªå®‰è£…方案将被设为默认。 è¿™æ„�味ç�€ä¸‹æ¸¸åˆ†å�‘æ–¹å�¯ä»¥ä¿®æ”¹é»˜è®¤çš„ sysconfig 安装方案而ä¸�会改å�˜è™šæ‹ŸçŽ¯å¢ƒçš„è¡Œä¸ºã€‚ å�Œæ ·ä¼šåˆ›å»ºæ–°çš„虚拟环境的第三方代ç �ä¹Ÿåº”å½“è¿™æ ·å�šã€‚ (由 Miro HronÄ�ok 在 bpo-45413 ä¸è´¡çŒ®ã€‚)
warnings¶
warnings.catch_warnings()现在接å�—warnings.simplefilter()çš„å�‚数,这æ��供了一ç§�在局部忽略è¦å‘Šæˆ–将其转为错误的更精确方å¼�。 (由 Zac Hatfield-Dodds 在 bpo-47074 ä¸è´¡çŒ®ã€‚)
zipfile¶
å¢žåŠ äº†ä¸ºåœ¨
ZipFile的目录和文件头ä¸è¯»å�–元数æ�®æŒ‡å®šæˆ�员å��ç§°ç¼–ç �æ ¼å¼�的支æŒ�。 (由 Stephen J. Turnbull å’Œ Serhiy Storchaka 在 bpo-28080 ä¸è´¡çŒ®ã€‚ï¼‰å¢žåŠ äº†
ZipFile.mkdir()用于在 ZIP å½’æ¡£ä¸æ–°å»ºç›®å½•。 (由 Sam Ezeh 在 gh-49083 ä¸è´¡çŒ®ã€‚)为
zipfile.Pathå¢žåŠ äº†stem,suffixå’Œsuffixes。 (由 Miguel Brito 在 gh-88261 ä¸è´¡çŒ®ã€‚)
性能优化¶
本节列出的特定优化å�‡ä¸�ä¾�赖于 æ›´å¿«çš„ CPython 项目,å�Žè€…å°†åœ¨å…¶ä¸“å±žç« èŠ‚ä¸åˆ—出。
编译器现在将优化å�ªåŒ…å�«æ ¼å¼�代ç �
%s,%rå’Œ%açš„å—符串å—é�¢å€¼ä¸çš„简å�• printf é£Žæ ¼ % æ ¼å¼�化 并使其速度与对应的 f-string 表达å¼�ä¸€æ ·å¿«ã€‚ (由 Serhiy Storchaka 在 bpo-28307 ä¸è´¡çŒ®ã€‚)整除è¿�ç®— (
//) 已进行了更好的编译器微调。 在 x86-64 上现在将int除以å°�于2**30的值时能够æ��速 20%。 (由 Gregory P. Smith å’Œ Tim Peters 在 gh-90564 ä¸è´¡çŒ®ã€‚)sum()现在对å°�于2**30的整数è¿�ç®—å�¯æ��速将近 30%。 (由 Stefan Behnel 在 gh-68264 ä¸è´¡çŒ®ã€‚)列表大å°�调整针对常è§�场景进行了优化,对于
list.append()å�¯æ��速 ≈15% 而对于简å�•çš„ list comprehension å�¯æ��速 20-30%。 (由 Dennis Sweeney 在 gh-91165 ä¸è´¡çŒ®ã€‚)å—典在所有键å�‡ä¸º Unicode 对象时将ä¸�ä¿�å˜å“ˆå¸Œå€¼ï¼Œä»¥ç¼©å‡�
dict的大å°�。 例如,sys.getsizeof(dict.fromkeys("abcdefg"))在 64 ä½�å¹³å�°ä¸Šå°†ä»Ž 352 å—节缩å‡�为 272 å—节(å‡�å°� 23%)。 (由 Inada Naoki 在 bpo-46845 ä¸è´¡çŒ®ã€‚)现在使用
asyncio.DatagramProtocol通过 UDP ä¼ è¾“å¤§æ–‡ä»¶æ—¶é€Ÿåº¦å°†æœ‰æˆ�æ•°é‡�级的æ��å�‡ï¼Œå¯¹äºŽ ≈60 MiB 的文件将å�¯æ��速 100 å€�以上。 (由 msoxzw 在 gh-91487 ä¸è´¡çŒ®ã€‚)现在
mathä¸çš„函数comb()å’Œperm()对于大å�‚æ•°å�¯æ��速 ≈10 å€�(对于越大的 k 值æ��速幅度越大)。 (由 Serhiy Storchaka 在 bpo-37295 ä¸è´¡çŒ®ã€‚)现在
statisticsä¸çš„函数mean(),variance()å’Œstdev()将会直接消耗è¿ä»£å™¨è€Œä¸�是先将它们转æ�¢ä¸ºlist。 这将使速度翻å€�并能节çœ�大é‡�内å˜ã€‚ (由 Raymond Hettinger 在 gh-90415 ä¸è´¡çŒ®ã€‚)现在
unicodedata.normalize()将在固定时间内æ£è§„化纯 ASCII å—符串。 (由 Donghee Na 在 bpo-44987 ä¸è´¡çŒ®ã€‚)
更快的 CPython¶
å¹³å�‡è€Œè¨€ CPython 3.11 比 CPython 3.10 å¿« 25%,该数æ�®æ˜¯ç”¨ pyperformance 基准测试套件测得的,基于 Ubuntu Linux 上的 GCC 编译版。 æ ¹æ�®å·¥ä½œè´Ÿè½½çš„ä¸�å�Œï¼Œæ€»çš„æ��速效果å�¯è¾¾ 10-60%。
本项目è�šç„¦äºŽ Python 的两个主è¦�领域: æ›´å¿«çš„å�¯åЍ å’Œ æ›´å¿«çš„è¿�行时。 本项目未涉å�Šçš„优化将在 性能优化 ä¸å�•独列出。
更快的�动¶
冻结导入 / é�™æ€�代ç �对象¶
Python 会将 bytecode 缓å˜åˆ° __pycache__ ç›®å½•ä»¥åŠ å¿«æ¨¡åž‹åŠ è½½çš„é€Ÿåº¦ã€‚
在 3.10 版本时,Python 模å�—æ‰§è¡Œç±»ä¼¼äºŽè¿™æ ·ï¼š
Read __pycache__ -> Unmarshal -> Heap allocated code object -> Evaluate
在 Python 3.11 ä¸ï¼Œå¯¹ Python å�¯åŠ¨å…·æœ‰å…³é”®å½±å“�çš„æ ¸å¿ƒæ¨¡å�—已被“冻结â€�。 è¿™æ„�味ç�€å®ƒä»¬çš„ 代ç �对象 (å�Šå—节ç �) 将由解释器é�™æ€�地分é…�。 这使得模å�—执行过程的æ¥éª¤å‡�少为:
Statically allocated code object -> Evaluate
现在 Python 3.11 解释器å�¯åŠ¨åŠ å¿«äº† 10-15%。 这对使用 Python çš„çŸæœŸè¿�行程åº�具有显著的影å“�。
(由 Eric Snow, Guido van Rossum å’Œ Kumar Aditya 在许多问题事件ä¸è´¡çŒ®ã€‚)
更快的�行时¶
开销更低�更为惰性的 Python 帧¶
å˜æ”¾æ‰§è¡Œä¿¡æ�¯çš„ Python 帧会在 Python 调用一个 Python 函数时被自动创建。 下é�¢æ˜¯æ–°å¸§çš„优化æ“�作:
优化改进了帧创建进程。
通过大é‡�é‡�用 C æ ˆä¸Šçš„å¸§ç©ºé—´æ�¥é�¿å…�内å˜åˆ†é…�。
将内部帧结构优化为仅包å�«å…³é”®ä¿¡æ�¯ã€‚ 在æ¤ä¹‹å‰�的帧ä¿�å˜æœ‰é¢�外的调试和内å˜ç®¡ç�†ä¿¡æ�¯ã€‚
现在旧å¼�çš„ 帧对象 仅在调试器或 Python 内çœ�函数如 sys._getframe() å’Œ inspect.currentframe() å�‘出请求时æ‰�会被创建。 对于大多数用户代ç �,将ä¸�会创建任何帧对象。 å› æ¤ï¼Œå‡ 乎所有 Python 函数调用都有显著的æ��速。 我们在 pyperformance 䏿µ‹å¾—了 3-7% çš„æ��速。
(由 Mark Shannon 在 bpo-44590 ä¸è´¡çŒ®ã€‚)
内�的 Python 函数调用¶
在 Python 函数调用期间,Python 将调用一个评测 C 函数æ�¥è§£è¯»è¯¥å‡½æ•°çš„代ç �。 这会有效地将纯 Python 递归é™�制在 C æ ˆçš„å®‰å…¨èŒƒå›´ä»¥å†…ã€‚
在 3.11 ä¸ï¼Œå½“ CPython 检测到 Python 代ç �调用了å�¦ä¸€ä¸ª Python 函数时,它会设置一个新帧,并“跳转â€�到新帧内部的新代ç �。 è¿™å�¯ä»¥é�¿å…�全部调用 C è§£æž�函数。
大多数 Python 函数调用现在将ä¸�消耗任何 C æ ˆç©ºé—´ï¼Œè¿™æ��å�‡äº†å®ƒä»¬çš„速度。 在简å�•的递归函数如æ–�波那契或阶乘函数ä¸ï¼Œæˆ‘们测得了 1.7x çš„æ��速。 这还æ„�味ç�€é€’归函数能够递归得更深(如果用户通过 sys.setrecursionlimit() æ��å�‡äº†é€’å½’é™�制的è¯�)。 我们在 pyperformance 䏿µ‹å¾—了 1-3% çš„æ��å�‡ã€‚
(由 Pablo Galindo å’Œ Mark Shannon 在 bpo-45256 ä¸è´¡çŒ®ã€‚)
PEP 659:专门化自适应解释器¶
PEP 659 是 Faster CPython 项目的关键部分之一。 基本ç�†å¿µåœ¨äºŽè™½ç„¶ Python 是一ç§�动æ€�è¯è¨€ï¼Œä½†å¤§éƒ¨åˆ†ä»£ç �都å˜åœ¨å¯¹è±¡å’Œç±»åž‹æž�å°‘å�‘生å�˜åŒ–的区域。 这一ç�†å¿µè¢«ç§°ä¸º 类型稳定性。
在è¿�行时,Python å°†å°�试在所执行的代ç �ä¸å¯»æ‰¾å¸¸è§�模å¼�和类型稳定性。 ç„¶å�Ž Python 将把当å‰�çš„æ“�作替æ�¢ä¸ºæ›´åŠ ä¸“é—¨åŒ–çš„æ“�作。 è¿™ç§�专门化的æ“�作使用仅对这些应用场景/类型æ�¥è¯´å�¯ç”¨çš„快速路径,它们的性能通常都会超过其泛用型的对应物。 这还带æ�¥äº†å��为 内è�”ç¼“å˜ çš„å�¦ä¸€é¡¹ç�†å¿µï¼Œå�³ Python 会将高消耗的æ“�作的结果直接缓å˜åœ¨ bytecode ä¸ã€‚
这个特化程�还会将特定的常�指令对�并为一�超级指令,�少执行期间的开销。
Python å°†å�ªç‰¹åŒ–(会被多次执行的)“çƒé—¨â€�代ç �。 è¿™å�¯ä»¥é˜²æ¢ Python 在å�ªæ‰§è¡Œä¸€æ¬¡çš„代ç �上浪费时间。 Python 还å�¯ä»¥åœ¨ä»£ç �过于动æ€�或用法å�‘生å�˜åŒ–æ—¶å�–消特化。 特化会定期地å°�试,而特化å°�试的开销也ä¸�高,这使得特化能够适应新的环境改å�˜ã€‚
(PEP 由 Mark Shannon 撰写,部分想法由 Stefan Brunthaler �供。 请�阅 PEP 659 了解详情。 由 Mark Shannon 和 Brandt Bucher 实现,并由 Irit Katriel 和 Dennis Sweeney �供了�外的帮助。)
�算 |
形� |
专门化 |
è¿�è¡ŒåŠ é€Ÿï¼ˆæœ€é«˜ï¼‰ |
贡献者 |
|---|---|---|---|---|
�目�算 |
|
常�类型如 |
10% |
Mark Shannon, Donghee Na, Brandt Bucher, Dennis Sweeney |
ä¸‹æ ‡ |
|
对容器类型如 对自定义 |
10-25% |
Irit Katriel, Mark Shannon |
å˜å‚¨ä¸‹æ ‡æ“�作 |
|
ç±»ä¼¼äºŽä¸Šè¿°çš„ä¸‹æ ‡æ“�作专门化。 |
10-25% |
Dennis Sweeney |
调用 |
|
对常用内置 (C) 函数和类型如 |
20% |
Mark Shannon, Ken Jin |
åŠ è½½å…¨å±€å�˜é‡� |
|
对象在全局/内置命å��空间ä¸çš„索引会被缓å˜ã€‚ åŠ è½½å…¨å±€å’Œå†…ç½®å�˜é‡�å°†ä¸�需è¦�命å��空间查找过程。 |
Mark Shannon |
|
åŠ è½½å±žæ€§ |
|
ç±»ä¼¼äºŽåŠ è½½å…¨å±€å�˜é‡�。 属性在类/对象命å��空间ä¸çš„索引会被缓å˜ã€‚ åœ¨å¤§å¤šæ•°æƒ…å†µä¸‹ï¼ŒåŠ è½½å±žæ€§å°†ä¸�需è¦�命å��空间查找过程。 |
Mark Shannon |
|
åŠ è½½è¦�调用的方法 |
|
方法的实际地å�€ä¼šè¢«ç¼“å˜ã€‚ åŠ è½½æ–¹æ³•çŽ°åœ¨å°†ä¸�需è¦�命å��空间查找过程 -- å�³ä½¿å¯¹äºŽå…·æœ‰è¾ƒé•¿ç»§æ‰¿é“¾çš„ç±»æ�¥è¯´ä¹Ÿæ˜¯å¦‚æ¤ã€‚ |
10-20% |
Ken Jin, Mark Shannon |
å˜å‚¨å±žæ€§ |
|
ç±»ä¼¼äºŽåŠ è½½å±žæ€§çš„ä¼˜åŒ–ã€‚ |
2% 的�行效率 |
Mark Shannon |
解包�列 |
|
针对常�容器如 |
8% |
Brandt Bucher |
�项¶
现在由于惰性创建的对象命å��空间对象需è¦�的内å˜å°†ä¼šå‡�少。 它们的命å��空间现在还将更自由地共享键。 (由 Mark Shannon 在 bpo-45340 å’Œ bpo-40116 ä¸è´¡çŒ®ã€‚)
实现了“零消耗�的异常,�在未引�任何异常时消除
tryè¯å�¥çš„开销。 (由 Mark Shannon 在 bpo-40222 ä¸è´¡çŒ®ã€‚ï¼‰è§£é‡Šå™¨ä¸æ›´ä¸ºç®€æ´�的异常表示形å¼�使得æ�•获异常所需的时间å‡�少了大约 10%。 (由 Irit Katriel 在 bpo-45711 ä¸è´¡çŒ®ã€‚)
reçš„æ£åˆ™è¡¨è¾¾å¼�匹é…�引擎已被部分é‡�构,现在会在å�—支æŒ�的平å�°ä¸Šä½¿ç”¨å·²è®¡ç®—çš„ goto(或“线程å¼�代ç �â€�)。 å› æ¤ï¼ŒPython 3.11 执行 pyperformance æ£åˆ™è¡¨è¾¾å¼�基准测试 相比 Python 3.10 æ��速了 10%。 (由 Brandt Bucher 在 gh-91404 ä¸è´¡çŒ®ã€‚)
常�问题¶
我è¦�如何编写代ç �ä»¥ä¾¿åº”ç”¨è¿™äº›åŠ é€Ÿï¼ŸÂ¶
请编写é�µå¾ªå¸¸è§�最佳实践的具有 Python é£Žæ ¼çš„ä»£ç �ï¼›ä½ ä¸�需è¦�ä¿®æ”¹ä½ çš„ä»£ç �。 CPython åŠ é€Ÿè®¡åˆ’ä¼šé’ˆå¯¹æˆ‘ä»¬è§‚å¯Ÿåˆ°çš„å¸¸è§�代ç �模å¼�进行优化。
CPython 3.11 会使用更多内å˜å�—?¶
å�¯èƒ½ä¸�会;我们预期内å˜å� ç”¨çš„å¢žåŠ ç›¸æ¯” 3.10 ä¸�会超过 20%。 这是通过上文æ��å�Šçš„帧对象和对象å—典内å˜ä¼˜åŒ–æ�¥å¹³è¡¡çš„。
我没有å�‘现我的è¿�è¡Œè´Ÿè½½æœ‰ä»»ä½•åŠ é€Ÿã€‚ 为什么?¶
特定代ç �å°†ä¸�会有明显的收益。 å¦‚æžœä½ çš„ä»£ç �大部时间消耗在 I/O æ“�作上,或者åƒ� NumPy é‚£æ ·å¤§éƒ¨åˆ†è®¡ç®—æ˜¯åœ¨ C 扩展库ä¸è¿›è¡Œçš„就将如æ¤ã€‚ ç›®å‰�这个项目将å�ªé’ˆå¯¹çº¯ Python çš„è¿�行负载。
æ¤å¤–,pyperformance åˆ†æ•°æ˜¯ä¸€ä¸ªå‡ ä½•å¹³å�‡å€¼ã€‚ å�³ä½¿åœ¨ pyperformance 基准测试内部,特定的基准测试也略有放缓,但其他的基准测试则有将近 2x çš„åŠ é€Ÿï¼�
是�有 JIT 编译器?¶
没有。 我们还在探索其他优化方�。
关于¶
CPython åŠ é€Ÿé¡¹ç›®æŽ¢ç´¢é’ˆå¯¹ CPython 的优化。 项目主团队由 Microsoft æ��供资助æ�¥æ”¯æŒ�å…¨è�Œå·¥ä½œã€‚ Pablo Galindo Salgado 还由 Bloomberg LP æ��供资助æ�¥å…¼è�Œè¯¥é¡¹ç›®ã€‚ æ¤å¤–,还有许多贡献者是æ�¥è‡ªç¤¾åŒºçš„志愿者。
CPython å—节ç �的改å�˜Â¶
å—节ç �现在包å�«å†…è�”ç¼“å˜æ�¡ç›®ï¼Œå®ƒé‡‡ç”¨æ–°å¢žçš„ CACHE 指令形å¼�。 许多æ“�作ç �都预期带有确切数é‡�的缓å˜ï¼Œå¹¶æŒ‡ç¤ºè§£é‡Šå™¨åœ¨è¿�行时跳过它们。 被填充的缓å˜çœ‹èµ·æ�¥å�¯ä»¥åƒ�是任æ„�æŒ‡ä»¤ï¼Œå› æ¤åœ¨è¯»å�–或修改包å�«åŠ é€Ÿçš„æ•°æ�®çš„原始自适应å—节ç �æ—¶åº”å½“æ ¼å¤–å°�心。
æ–°çš„æ“�作ç �¶
ASYNC_GEN_WRAP,RETURN_GENERATORå’ŒSEND,用于生æˆ�器和å��程。COPY_FREE_VARS,这å�¯ä»¥é�¿å…�需è¦�特别的调用方代ç �æ�¥å…³é—。JUMP_BACKWARD_NO_INTERRUPT,用于æŸ�些ä¸�希望处ç�†ä¸æ–的循环。MAKE_CELL,用于创建 Cell 对象。CHECK_EG_MATCHå’ŒPREP_RERAISE_STAR,用于处ç�†åœ¨ PEP 654 ä¸å¢žåŠ çš„ 新异常组和 except*。PUSH_EXC_INFO,用于异常处ç�†å�¥æŸ„。RESUME,空æ“�作,用于内部追踪ã€�调试和优化检查。
被替æ�¢çš„æ“�作ç �¶
被替æ�¢çš„æ“�作ç � |
新增的æ“�作ç � |
备注 |
|---|---|---|
BINARY_*INPLACE_* |
用å�•个æ“�作ç �替æ�¢æ‰€æœ‰æ•°å€¼ç±»å�Œç›®/原地æ“�作ç � |
|
CALL_FUNCTIONCALL_FUNCTION_KWCALL_METHOD |
对方法的å�‚æ•°å�˜æ�¢ä¸Žå…³é”®å—å�‚数的处ç�†è¿›è¡Œè§£å�¶ï¼›å…�许更好的调用特化 |
|
DUP_TOPDUP_TOP_TWOROT_TWOROT_THREEROT_FOURROT_N |
æ ˆæ“�纵指令 |
|
JUMP_IF_NOT_EXC_MATCH |
现在会执行检查但�会跳转 |
|
JUMP_ABSOLUTEPOP_JUMP_IF_FALSEPOP_JUMP_IF_TRUE |
�� [3]; 针对�个方�的 |
|
SETUP_WITHSETUP_ASYNC_WITH |
|
所有跳转æ“�作ç �现在都是相对的,包括现有的 JUMP_IF_TRUE_OR_POP å’Œ JUMP_IF_FALSE_OR_POP。 该å�‚数现在是相对于当å‰�指令的å��ç§»é‡�而ä¸�是ç»�对ä½�置。
修改/移除的æ“�作ç �¶
修改
MATCH_CLASSå’ŒMATCH_KEYS为ä¸�å†�推入é¢�外的布尔值æ�¥æŒ‡ç¤ºæˆ�功/失败。 而是在失败时推入Noneæ�¥ä»£æ›¿ç”±è¢«æ��å�–值组æˆ�的元组。修改é…�å�ˆå¼‚常使用的æ“�作ç �以å��æ˜ å®ƒä»¬çŽ°åœ¨æ˜¯ç”±æ ˆä¸Šçš„ä¸€ä¸ªæ�¡ç›®è€Œé�žä¸‰ä¸ªæ�¡ç›®ä»£è¡¨ (å�‚è§� gh-89874)。
移除了
COPY_DICT_WITHOUT_KEYS,GEN_START,POP_BLOCK,SETUP_FINALLY和YIELD_FROM。
弃用¶
本å°�节列出了已在 Python 3.11 ä¸å¼ƒç”¨çš„ Python API。
已弃用的 C API 将 �独列出。
è¯è¨€/内置对象¶
串连
classmethodæ��述器(在 bpo-19072 ä¸å¼•入)现已被弃用。 它ä¸�能å†�被用æ�¥åŒ…装其他æ��述器如property。 è¯¥ç‰¹æ€§çš„æ ¸å¿ƒè®¾è®¡å˜åœ¨ç¼ºé™·å¹¶å¯¼è‡´äº†è®¸å¤šä¸‹æ¸¸é—®é¢˜ã€‚ è¦�“穿过â€�一个classmethod,请考虑使用在 Python 3.10 䏿·»åŠ çš„__wrapped__属性。 (由 Raymond Hettinger 在 gh-89519 ä¸è´¡çŒ®ã€‚)数值大于
0o377(å��进制的 255) 的八进制转义符会产生DeprecationWarning。 在未æ�¥çš„ Python 版本ä¸ï¼Œè¿™å°†å¼•å�‘SyntaxWarning并最终改为SyntaxError。 (由 Serhiy Storchaka 在 gh-81548 ä¸è´¡çŒ®ã€‚)现在从
int()至__trunc__()的委托已被弃用。 当type(a)实现了__trunc__()但未实现__int__()或__index__()时调用int(a)现在将引å�‘DeprecationWarning。 (由 Zackery Spytz 在 bpo-44977 ä¸è´¡çŒ®ã€‚)
模�¶
PEP 594 使得以下模å�—被弃用并将在 Python 3.13 ä¸è¢«ç§»é™¤:
(由 Brett Cannon 在 bpo-47061 以å�Š Victor Stinner 在 gh-68966 ä¸è´¡çŒ®ã€‚)
至少从 Python 3.6 起
asynchat,asyncoreå’Œsmtpd模å�—已被弃用。 它们的文档和弃用è¦å‘ŠçŽ°åœ¨å·²æ›´æ–°ä¸ºæ��示它们将在 Python 3.12 ä¸è¢«ç§»é™¤ã€‚ (由 Hugo van Kemenade 在 bpo-47022 ä¸è´¡çŒ®ã€‚)lib2to3包和 2to3 工具现已被弃用并å�¯èƒ½æ— 法解æž� Python 3.10 或更新版本。 å�‚è§�引入新 PEG è§£æž�器的 PEP 617 了解详情。 (由 Victor Stinner 在 bpo-40360 ä¸è´¡çŒ®ã€‚)未写入文档的模å�—
sre_compile,sre_constantså’Œsre_parse现已被弃用。 (由 Serhiy Storchaka 在 bpo-47152 ä¸è´¡çŒ®ã€‚)
æ ‡å‡†åº“Â¶
configparser的下列部分自 Python 3.2 起已被弃用。 现在它们的弃用è¦å‘Šå·²æ›´æ–°ä¸ºæ��示它们将在 Python 3.12 ä¸è¢«ç§»é™¤:configparser.SafeConfigParserç±»configparser.ParsingError.filename特å¾�属性configparser.RawConfigParser.readfp()方法
(由 Hugo van Kemenade 在 bpo-45173 ä¸è´¡çŒ®ã€‚)
configparser.LegacyInterpolation自 Python 3.2 起已在文档å—符串ä¸è¢«å¼ƒç”¨ï¼Œå¹¶æœªåœ¨configparser文档ä¸åˆ—出。 现在它将å�‘出DeprecationWarning并将在 Python 3.13 ä¸è¢«ç§»é™¤ã€‚ 请改用configparser.BasicInterpolation或configparser.ExtendedInterpolation。 (由 Hugo van Kemenade 在 bpo-46607 ä¸è´¡çŒ®ã€‚)较旧的
importlib.resources函数集å�ˆå·²è¢«å¼ƒç”¨è€Œæ”¹ç”¨åœ¨ Python 3.9 䏿·»åŠ çš„æ›¿ä»£ç‰©å¹¶å°†åœ¨æœªæ�¥çš„ Python 版本ä¸è¢«ç§»é™¤ï¼Œå› 为它们ä¸�支æŒ�ä½�于 package å�目录下的资æº�:locale.getdefaultlocale()函数已被弃用并将在 Python 3.15 ä¸ç§»é™¤ã€‚ 请改用locale.setlocale(),locale.getpreferredencoding(False)å’Œlocale.getlocale()函数。 (由 Victor Stinner 在 gh-90817 ä¸è´¡çŒ®ã€‚)locale.resetlocale()函数已被弃用并将在 Python 3.13 ä¸ç§»é™¤ã€‚ 请改用locale.setlocale(locale.LC_ALL, "")。 (由 Victor Stinner 在 gh-90817 ä¸è´¡çŒ®ã€‚)现在对于 æ£åˆ™è¡¨è¾¾å¼� ä¸çš„æ•°å—分组引用和分组å��ç§°å°†åº”ç”¨æ›´ä¸¥æ ¼çš„è§„åˆ™ã€‚ 现在å�ªæœ‰ ASCII æ•°å—åº�列会被接å�—作为数å—引用,而
bytes模å¼�和替æ�¢å—符串ä¸çš„分组å��ç§°å�ªèƒ½åŒ…å�« ASCII å—æ¯�ã€�æ•°å—和下划线。 ç›®å‰�对于è¿�å��è¿™äº›è§„åˆ™çš„è¯æ³•将会引å�‘弃用è¦å‘Šã€‚ (由 Serhiy Storchaka 在 gh-91760 ä¸è´¡çŒ®ã€‚)在
re模å�—ä¸ï¼Œre.template()函数和相应的re.TEMPLATEå’Œre.Tæ——æ ‡å·²è¢«å¼ƒç”¨ï¼Œå› ä¸ºå®ƒä»¬æœªè¢«å†™å…¥æ–‡æ¡£å¹¶ç¼ºå°‘æ˜Žæ˜¾çš„ç›®çš„ã€‚ 它们将在 Python 3.13 ä¸ç§»é™¤ã€‚ (由 Serhiy Storchaka å’Œ Miro HronÄ�ok 在 gh-92728 由贡献。)turtle.settiltangle()自 Python 3.1 起已被弃用;现在它会å�‘出弃用è¦å‘Šå¹¶å°†åœ¨ Python 3.13 ä¸ç§»é™¤ã€‚ 请改用turtle.tiltangle()(该函数在æ¤å‰�è¢«é”™è¯¯åœ°æ ‡è®°ä¸ºå·²å¼ƒç”¨ï¼ŒçŽ°åœ¨å®ƒçš„æ–‡æ¡£å—符串已被修æ£)。 (由 Hugo van Kemenade 在 bpo-45837 ä¸è´¡çŒ®ã€‚)typing.Text,它的å˜åœ¨å�ªæ˜¯ä¸ºäº†åœ¨ Python 2 å’Œ Python 3 代ç �之间æ��供兼容性支æŒ�,现在已被弃用。 ç›®å‰�å°šæ— ç§»é™¤å®ƒçš„è®¡åˆ’ï¼Œä½†æŽ¨è��用户在任何å�¯èƒ½çš„地方改用str。 (由 Alex Waygood 在 gh-92332 ä¸è´¡çŒ®ã€‚)用于构é€
typing.TypedDict类型的关键å—å�‚æ•°è¯æ³•现在已被弃用。 将在 Python 3.13 ä¸ç§»é™¤å¯¹å®ƒçš„æ”¯æŒ�。 (由 Jingchen Ye 在 gh-90224 ä¸è´¡çŒ®ã€‚)webbrowser.MacOSX已被弃用并将在 Python 3.13 ä¸ç§»é™¤ã€‚ 它未ç»�测试,未写入文档,也未被webbrowser本身所使用。 (由 Donghee Na 在 bpo-42255 ä¸è´¡çŒ®ã€‚)从
TestCaseå’ŒIsolatedAsyncioTestCase测试方法返回一个值(默认的None以外的值)的行为现在已被弃用。已弃用下列未æ£å¼�写入文档的
unittest函数,计划在 Python 3.13 ä¸ç§»é™¤:unittest.findTestCases()unittest.makeSuite()unittest.getTestCaseNames()
请改用
TestLoader方法:(由 Erlend E. Aasland 在 bpo-5846 ä¸è´¡çŒ®ã€‚)
unittest.TestProgram.usageExit()è¢«æ ‡è®°ä¸ºå·²å¼ƒç”¨ï¼Œå°†åœ¨ 3.13 ä¸è¢«ç§»é™¤ã€‚ (由 Carlos Damázio 在 gh-67048 ä¸è´¡çŒ®ã€‚)
计划在 Python 3.12 ä¸ç§»é™¤Â¶
以下 Python API 已在之å‰�çš„ Python å�‘布版ä¸å¼ƒç”¨ï¼Œå¹¶å°†åœ¨ Python 3.12 ä¸ç§»é™¤ã€‚
C API 的移除计划将 �独列出。
asynchat模�asyncore模�imp模�typing.io命�空间typing.re命�空间cgi.log()importlib.find_loader()importlib.abc.Loader.module_repr()importlib.abc.MetaPathFinder.find_module()importlib.abc.PathEntryFinder.find_loader()importlib.abc.PathEntryFinder.find_module()importlib.machinery.BuiltinImporter.find_module()importlib.machinery.BuiltinLoader.module_repr()importlib.machinery.FileFinder.find_loader()importlib.machinery.FileFinder.find_module()importlib.machinery.FrozenImporter.find_module()importlib.machinery.FrozenLoader.module_repr()importlib.machinery.PathFinder.find_module()importlib.machinery.WindowsRegistryFinder.find_module()importlib.util.module_for_loader()importlib.util.set_loader_wrapper()importlib.util.set_package_wrapper()pkgutil.ImpImporterpkgutil.ImpLoaderpathlib.Path.link_to()sqlite3.enable_shared_cache()sqlite3.OptimizedUnicode()PYTHONTHREADDEBUG环境��The following deprecated aliases in
unittestä¸çš„下列已弃用别å��:已弃用的别å��
方法�
弃用于
failUnless3.1
failIf3.1
failUnlessEqual3.1
failIfEqual3.1
failUnlessAlmostEqual3.1
failIfAlmostEqual3.1
failUnlessRaises3.1
assert_3.2
assertEquals3.2
assertNotEquals3.2
assertAlmostEquals3.2
assertNotAlmostEquals3.2
assertRegexpMatches3.2
assertRaisesRegexp3.2
assertNotRegexpMatches3.5
移除¶
本å°�节列出了已在 Python 3.11 ä¸ç§»é™¤çš„ Python API。
已移除的 C API 将 �独列出。
移除了�许旧�基于生�器的�程兼容
async/await代ç �çš„@asyncio.coroutine()decorator。 该函数自 Python 3.8 起已被弃用并且原定在 Python 3.10 ä¸ç§»é™¤ã€‚ 请改用async def。 (由 Illia Volochii 在 bpo-43216 ä¸è´¡çŒ®ã€‚)移除了用于在调试模å¼�下包装旧å¼�基于生æˆ�器的å��程对象的
asyncio.coroutines.CoroWrapper。 (由 Illia Volochii 在 bpo-43216 ä¸è´¡çŒ®ã€‚)出于显著的安全性考é‡�,自 Python 3.9 起已被ç¦�用的
asyncio.loop.create_datagram_endpoint()çš„ reuse_address å½¢å�‚现在已彻底移除。 è¿™æ˜¯å› ä¸ºåœ¨ UDP ä¸å¥—接å—选项SO_REUSEADDR的行为。 (由 Hugo van Kemenade 在 bpo-45129 ä¸è´¡çŒ®ã€‚)移除了自 Python 3.9 起已弃用的
binhex模å�—。 并移除了相关è�”çš„å�Œæ ·å·²å¼ƒç”¨çš„binascii函数:binascii.a2b_hqx()binascii.b2a_hqx()binascii.rlecode_hqx()binascii.rldecode_hqx()
binascii.crc_hqx()函数ä»�ç„¶å�¯ç”¨ã€‚(由 Victor Stinner 在 bpo-45085 ä¸è´¡çŒ®ã€‚)
移除了自 Python 3.9 起已弃用的
distutilsbdist_msi命令。 请改用bdist_wheel(wheel 包)。 (由 Hugo van Kemenade 在 bpo-45124 ä¸è´¡çŒ®ã€‚)移除了自 Python 3.9 起已弃用的
xml.dom.pulldom.DOMEventStream,wsgiref.util.FileWrapperå’Œfileinput.FileInputçš„__getitem__()方法。 (由 Hugo van Kemenade 在 bpo-45132 ä¸è´¡çŒ®ã€‚)移除了已弃用的
gettext函数lgettext(),ldgettext(),lngettext()å’Œldngettext()。 并移除了bind_textdomain_codeset()函数ã€�NullTranslations.output_charset()å’ŒNullTranslations.set_output_charset()方法,以å�Štranslation()å’Œinstall()çš„ codeset å½¢å�‚ ï¼Œå› ä¸ºå®ƒä»¬ä»…è¢«ç”¨äºŽl*gettext()函数。 (由 Donghee Na å’Œ Serhiy Storchaka 在 bpo-44235 ä¸è´¡çŒ®ã€‚)已从
inspect模å�—ä¸ç§»é™¤:getargspec()函数自 Python 3.0 起已被弃用;请改用inspect.signature()或inspect.getfullargspec()。formatargspec()函数自 Python 3.5 起已被弃用;请改用inspect.signature()函数或直接使用inspect.Signature对象。未写入文档的
Signature.from_builtin()和Signature.from_function()方法自 Python 3.5 起已被弃用;请改用Signature.from_callable()方法。
(由 Hugo van Kemenade 在 bpo-45320 ä¸è´¡çŒ®ã€‚)
从
pathlib.PurePathä¸ç§»é™¤äº†__class_getitem__()æ–¹æ³•ï¼Œå› ä¸ºå®ƒä»Žæœªè¢«ä½¿ç”¨è€Œæ˜¯åœ¨ä¹‹å‰�版本ä¸è¯¯æ·»åŠ çš„ã€‚ (由 Nikita Sobolev 在 bpo-46483 ä¸è´¡çŒ®ã€‚)移除了
smtpd模å�—ä¸çš„MailmanProxyç±»ï¼Œå› ä¸ºå®ƒåœ¨æ²¡æœ‰å¤–éƒ¨mailmanåŒ…æ—¶æ˜¯æ— æ³•ä½¿ç”¨çš„ã€‚ (由 Donghee Na 在 bpo-35800 ä¸è´¡çŒ®ã€‚)移除了
_tkinter.TkappTypeä¸å·²è¢«å¼ƒç”¨çš„split()方法。 (由 Erlend E. Aasland 在 bpo-38371 ä¸è´¡çŒ®ã€‚)从
unittestå�‘现ä¸ç§»é™¤äº†å‘½å��空间包支æŒ�。 它在 Python 3.4 ä¸å¼•入但自 Python 3.7 èµ·å·²ä¸�å�¯ç”¨ã€‚ (由 Inada Naoki 在 bpo-23882 ä¸è´¡çŒ®ã€‚)移除了未写入文档的ç§�有
float.__set_format__()方法,之å‰�在 Python 3.7 ä¸å��为float.__setformat__()。 其文档å—ç¬¦ä¸²å·²å†™æ˜Žï¼šâ€œä½ åº”è¯¥ä¸�需è¦�使用æ¤å‡½æ•°ã€‚ 它的å˜åœ¨ä¸»è¦�是用于 Python 的测试套件。â€� (由 Victor Stinner 在 bpo-46852 ä¸è´¡çŒ®ã€‚)--experimental-isolated-subinterpretersé…�ç½®æ——æ ‡ï¼ˆå’Œç›¸åº”çš„EXPERIMENTAL_ISOLATED_SUBINTERPRETERSå®�)已被移除。Pynche --- The Pythonically Natural Color and Hue Editor --- 已被移出
Tools/scripts并将脱离 Python æº�代ç �æ ‘ 独立开å�‘。
移�到 Python 3.11¶
本节列出了先å‰�æ��述的更改以å�Š Python API ä¸å�¯èƒ½éœ€è¦�ä¿®æ”¹ä½ çš„ Python 代ç �的其他错误修æ£ã€‚
针对 C API 的移�说明将 �独列出。
open(),io.open(),codecs.open()å’Œfileinput.FileInput的文件模å¼�ä¸ä¸�å†�接å�—'U'("通用æ�¢è¡Œç¬¦")。 在 Python 3 ä¸ï¼Œ"通用æ�¢è¡Œç¬¦" 模å¼�会在文件以文本模å¼�打开时默认被使用,而'U'æ——æ ‡è‡ª Python 3.3 起已被弃用。 这些函数的 newline å½¢å�‚ 将控制如何使用通用æ�¢è¡Œç¬¦ã€‚ (由 Victor Stinner 在 bpo-37330 ä¸è´¡çŒ®ã€‚)现在
ast.AST节点ä½�置在æ��供给compile()和其他相关函数时会进行验è¯�。 å¦‚æžœæ£€æµ‹åˆ°æ— æ•ˆä½�置, 将会引å�‘ValueError。 (由 Pablo Galindo 在 gh-93351 䏿��供。)继在 Python 3.8 ä¸å¼ƒç”¨å�Žï¼Œå·²ç¦�æ¢å�‘
asyncio.loop.set_default_executor()ä¼ å…¥é�žconcurrent.futures.ThreadPoolExecutor执行器。(由 Illia Volochii 在 bpo-43234 ä¸è´¡çŒ®ã€‚)calendar: 在未指定è¯è¨€åŒºåŸŸçš„æƒ…况下,calendar.LocaleTextCalendarå’Œcalendar.LocaleHTMLCalendar类现在会使用locale.getlocale(),而ä¸�是使用locale.getdefaultlocale()。 (由 Victor Stinner 在 bpo-46659 ä¸è´¡çŒ®ã€‚)现在
pdb模å�—会使用'UTF-8'ç¼–ç �æ�¥è¯»å�–.pdbrcé…�置文件。 (由 Srinivas Reddy Thatiparthy (à°¶à±�రీనివాసà±� రెడà±�à°¡à°¿ తాటిపరà±�తి) 在 bpo-41137 ä¸è´¡çŒ®ã€‚)random.sample()çš„ population å½¢å�‚必须是一个åº�列,ä¸�å†�支æŒ�å°†set自动转æ�¢ä¸ºlist。 æ¤å¤–ï¼Œå¦‚æžœæ ·æœ¬å¤§å°�大于总体大å°�,将会引å�‘ValueError。 (由 Raymond Hettinger 在 bpo-40465 ä¸è´¡çŒ®ã€‚)移除了
random.shuffle()çš„ random å�¯é€‰å½¢å�‚。 在之å‰�版本ä¸é‡�排æ“�作是使用任æ„�éš�机函数;现在,将始终使用random.random()(之å‰�的默认值)。在
reæ£åˆ™è¡¨è¾¾å¼�è¯æ³• ä¸ï¼Œå…¨å±€å†…è�”æ——æ ‡ (例如(?i)) 现在å�ªèƒ½åœ¨æ£åˆ™è¡¨è¾¾å¼�的开头使用。 自 Python 3.6 èµ·åœ¨åˆ«å¤„ä½¿ç”¨è¿™äº›æ——æ ‡çš„å�šæ³•å·²è¢«å¼ƒç”¨ã€‚ (由 Serhiy Storchaka 在 bpo-47066 ä¸è´¡çŒ®ï¼‰ã€‚在
re模å�—ä¸ï¼Œä¿®å¤�äº†å‡ ä¸ªé•¿æœŸå˜åœ¨çš„错误,在æž�少数情况下,这些错误å�¯èƒ½ä¼šå¯¼è‡´æ�•获分组得到错误的结果。 å› æ¤ï¼Œè¿™å�¯èƒ½ä¼šæ”¹å�˜è¿™äº›æƒ…况下的æ�•获输出。 (由 Ma Lin 在 bpo-35859 ä¸è´¡çŒ®ã€‚)
构建�化¶
CPython 现已具有 PEP 11 Tier 3 support 以便交�编译至 WebAssembly 平� Emscripten (
wasm32-unknown-emscriptenå�³æµ�览器版 Python) å’Œ WebAssembly System Interface (WASI) (wasm32-unknown-wasi)。 æ¤è®¡åˆ’çš„ç�µæ„Ÿæ�¥è‡ªå‰�人的工作如 Pyodide。 这些平å�°æ��供了 POSIX API 的有é™�å�集;与网络ã€�进程ã€�线程ã€�ä¿¡å�·ã€�mmap 和用户/组相关的 Python æ ‡å‡†åº“ç‰¹æ€§å’Œæ¨¡å�—å°†ä¸�å�¯ç”¨æˆ–æ— æ³•æ£å¸¸å·¥ä½œã€‚ (Emscripten ç”± Christian Heimes å’Œ Ethan Smith 在 gh-84461 ä¸è´¡çŒ®ï¼ŒWASI ç”± Christian Heimes 在 gh-90473 ä¸è´¡çŒ®ï¼›å¹³å�°çš„æŽ¨è¿›åœ¨ gh-95085 ä¸è¿½è¸ªã€‚)构建 CPython 现在需è¦�:
Py_NO_NANå®�已被移除。 由于 CPython 现在è¦�求 IEEE 754 浮点数,NaN 值将始终å�¯ç”¨ã€‚ (由 Victor Stinner 在 bpo-46656 ä¸è´¡çŒ®ã€‚)tkinter包现在需è¦� Tcl/Tk 8.5.12 或更新的版本。 (由 Serhiy Storchaka 在 bpo-46996 ä¸è´¡çŒ®ã€‚ï¼‰å¤§å¤šæ•°æ ‡å‡†åº“æ‰©å±•æ¨¡å�—的构建ä¾�èµ–ã€�ç¼–è¯‘å™¨æ——æ ‡å’Œé“¾æŽ¥å™¨æ——æ ‡çŽ°åœ¨å°†ç”± configure æ�¥æ£€æµ‹ã€‚ libffi, libnsl, libsqlite3, zlib, bzip2, liblzma, libcrypt, Tcl/Tk å’Œ uuid æ——æ ‡å°†ç”± pkg-config (如果å�¯ç”¨) æ�¥æ£€æµ‹ã€‚
tkinter现在需è¦�ç”± pkg-config 命令æ�¥æ£€æµ‹ Tcl/Tk æ ‡å¤´å’Œåº“çš„å¼€å�‘设置。 (由 Christian Heimes å’Œ Erlend Egeberg Aasland 在 bpo-45847, bpo-45747 å’Œ bpo-45763 ä¸è´¡çŒ®ã€‚)libpython ä¸�å†�与 libcrypt 链接。 (由 Mike Gilbert 在 bpo-45433 ä¸è´¡çŒ®ã€‚)
现在 CPython �以通过�
--with-ltoä¼ å…¥thin,å�³--with-lto=thin在编译时å�¯ç”¨ ThinLTO 选项。 (由 Donghee Na å’Œ Brett Holman 在 bpo-44340 ä¸è´¡çŒ®ã€‚)现在å�¯ä»¥ç¦�用对象结构体的自由列表。 æ–°çš„ configure 选项
--without-freelistså�¯ç”¨äºŽç¦�用除空元组å�•例之外的所有自由列表。 (由 Christian Heimes 在 bpo-45522 ä¸è´¡çŒ®ã€‚)Modules/Setupå’ŒModules/makesetup已获得改进并进行绑定。 扩展模å�—现在å�¯ä»¥é€šè¿‡makesetupæ�¥æž„建。 除部分测试模å�—外所有模å�—都å�¯ä»¥é�™æ€�链接到主二进制文件或库ä¸ã€‚ (由 Brett Cannon å’Œ Christian Heimes 在 bpo-45548, bpo-45570, bpo-45571 å’Œ bpo-43974 ä¸è´¡çŒ®ã€‚)备注
使用环境��
TCLTK_CFLAGS和TCLTK_LIBS�手动指定 Tcl/Tk 头文件和库的�置。 configure 选项--with-tcltk-includes和--with-tcltk-libs已被移除。在 RHEL 7 和 CentOS 7 上开�包将��供
tcl.pcå’Œtk.pc;请使用TCLTK_LIBS="-ltk8.5 -ltkstub8.5 -ltcl8.5"。Misc/rhel7目录包å�«.pc文件以å�Šå¦‚何使用 RHEL 7 å’Œ CentOS 7 çš„ Tcl/Tk å’Œ OpenSSL 构建 Python 的说明。CPython 现在将默认使用 30 比特ä½�çš„æ•°å—æ�¥å®žçް Python
int。 之å‰�版本ä¸ï¼Œåœ¨SIZEOF_VOID_P >= 8的平å�°ä¸Šé»˜è®¤ä½¿ç”¨ 30 比特ä½�æ•°å—,å�¦åˆ™ä½¿ç”¨ 15 ä½�æ•°å—。 ä»�然有å�¯èƒ½é€šè¿‡é…�置脚本的--enable-big-digits选项或PC/pyconfig.hä¸çš„PYLONG_BITS_IN_DIGITå�˜é‡�(适用于 Windows)显å¼�地è¦�求使用 15 比特ä½�æ•°å—,但该选项å�¯èƒ½ä¼šåœ¨æœªæ�¥æŸ�个时候被移除。 (由 Mark Dickinson 在 bpo-45569 ä¸è´¡çŒ®ã€‚)
C API 的�化¶
新的特性¶
新增了
PyType_GetName()函数用æ�¥èŽ·å�–类型的简çŸå��称。 (由 Hai Shi 在 bpo-42035 ä¸è´¡çŒ®ã€‚)新增了
PyType_GetQualName()函数用æ�¥èŽ·å�–类型的é™�定å��称。 (由 Hai Shi 在 bpo-42035 ä¸è´¡çŒ®ã€‚)在å�—é™�çš„ C API 䏿–°å¢žäº†
PyThreadState_EnterTracing()å’ŒPyThreadState_LeaveTracing()函数用æ�¥æŒ‚èµ·å’Œæ�¢å¤�追踪和性能分æž�。 (由 Victor Stinner 在 bpo-43760 ä¸è´¡çŒ®ã€‚ï¼‰å¢žåŠ äº†
Py_Version常é‡�,其ä¸çš„值与PY_VERSION_HEX相å�Œã€‚ (由 Gabriele N. Tornetta 在 bpo-43931 ä¸è´¡çŒ®ã€‚)Py_bufferå�Šå…¶ API 现在是å�—é™� API 和稳定 ABI 的组æˆ�部分:bf_getbufferå’Œbf_releasebuffer类型槽ä½�
(由 Christian Heimes 在 bpo-45459 ä¸è´¡çŒ®ã€‚)
å¢žåŠ äº†
PyType_GetModuleByDef()å‡½æ•°ï¼Œç”¨äºŽåœ¨æ— æ³•ç›´æŽ¥èŽ·å�–ä¿¡æ�¯çš„æƒ…况下 (通过PyCMethod) 获å�–方法定义所在的模å�—。 (由 Petr Viktorin 在 bpo-46613 ä¸è´¡çŒ®ã€‚ï¼‰æ·»åŠ äº†ç”¨äºŽæ‰“åŒ…å’Œè§£åŒ… C double (åº�列化和å��åº�列化) 的新函数:
PyFloat_Pack2(),PyFloat_Pack4(),PyFloat_Pack8(),PyFloat_Unpack2(),PyFloat_Unpack4()å’ŒPyFloat_Unpack8()。 (由 Victor Stinner 在 bpo-46906 ä¸è´¡çŒ®ã€‚ï¼‰æ·»åŠ äº†ç”¨äºŽèŽ·å�–帧对象属性的新函数:
PyFrame_GetBuiltins(),PyFrame_GetGenerator(),PyFrame_GetGlobals(),PyFrame_GetLasti()。新增了两个用于获�和设置活动异常实例的函数:
PyErr_GetHandledException()å’ŒPyErr_SetHandledException()。 这两个函数是PyErr_SetExcInfo()å’ŒPyErr_GetExcInfo()的替代å“�,å�Žè€…ä½¿ç”¨ä¼ ç»Ÿçš„ 3 元组表示异常。 (由 Irit Katriel 在 bpo-46343 ä¸è´¡çŒ®ã€‚ï¼‰æ·»åŠ äº†
PyConfig.safe_pathæˆ�员。 (由 Victor Stinner 在 gh-57684 ä¸è´¡çŒ®ã€‚).)
移�到 Python 3.11¶
部分å®�已被转æ�¢ä¸ºé�™æ€�内è�”函数以é�¿å…� å®�陷阱。 这项改å�˜å¯¹ç”¨æˆ·æ�¥è¯´åº”è¯¥æ˜¯åŸºæœ¬æ— æ„Ÿçš„ï¼Œå› ä¸ºæ›¿ä»£å‡½æ•°ä¼šå°†å…¶å�‚数强制转æ�¢ä¸ºé¢„期的类型以é�¿å…�é�™æ€�类型检查导致的编译器è¦å‘Šã€‚ 但是,当å�—é™� C API 被设为 >=3.11 时,将ä¸�会执行这些强制转æ�¢ï¼Œè°ƒç”¨æ–¹å°†éœ€è¦�自行将å�‚数强制转æ�¢ä¸ºå…¶é¢„期的类型。 请å�‚阅 PEP 670 了解详情。 (由 Victor Stinner å’Œ Erlend E. Aasland 在 gh-89653 ä¸è´¡çŒ®ã€‚)
PyErr_SetExcInfo()ä¸�å†�使用typeå’Œtracebackå�‚数,解释器现在将从异常实例( å�³valueå�‚数)ä¸èŽ·å�–这些值。 该函数ä»�会å�·å�–对所有三个å�‚数的引用。 (由 Irit Katriel 在 bpo-45711 ä¸è´¡çŒ®ã€‚)PyErr_GetExcInfo()现在将从异常实例(å�³valueå—æ®µï¼‰èŽ·å�–结果的typeå’Œtracebackå—æ®µã€‚ (由 Irit Katriel 在 bpo-45711 ä¸è´¡çŒ®ã€‚)_frozen新增了is_packageå—æ®µç”¨æ�¥æŒ‡æ˜Žå†»ç»“模å�—是å�¦ä¸ºåŒ…。 之å‰�,是将sizeå—æ®µè®¾ç½®è´Ÿå€¼ä½œä¸ºæŒ‡ç¤ºç¬¦ã€‚ 现在sizeå°†å�ªä½¿ç”¨é�žè´Ÿå€¼ã€‚ (由 Kumar Aditya 在 bpo-46608 ä¸è´¡çŒ®ã€‚)现在
_PyFrameEvalFunction()接å�—_PyInterpreterFrame*作为其第二个形å�‚,而ä¸�是PyFrameObject*。 请å�‚阅 PEP 523 了解如何使用æ¤å‡½æ•°æŒ‡é’ˆç±»åž‹çš„æ›´å¤šç»†èŠ‚ã€‚çŽ°åœ¨
PyCode_New()å’ŒPyCode_NewWithPosOnlyArgs()接å�—一个é¢�外的exception_tableå�‚数。 如有å�¯èƒ½ï¼Œåº”当é�¿å…�使用这些函数。 获å�–自定义的代ç �对象:使用编译器创建一个代ç �对象,然å�Žä½¿ç”¨replace方法得到修改å�Žçš„版本。PyCodeObjectä¸�å†�具有co_code,co_varnames,co_cellvarså’Œco_freevarså—æ®µã€‚ 请分别改用PyCode_GetCode(),PyCode_GetVarnames(),PyCode_GetCellvars()å’ŒPyCode_GetFreevars()通过 C API æ�¥è®¿é—®å®ƒä»¬ã€‚ (由 Brandt Bucher 在 bpo-46841 以å�Š Ken Jin 在 gh-92154 å’Œ gh-94936 ä¸è´¡çŒ®ã€‚)旧的垃圾桶å®� (
Py_TRASHCAN_SAFE_BEGIN/Py_TRASHCAN_SAFE_END) 现在已被弃用。 它们应该由新的�Py_TRASHCAN_BEGIN和Py_TRASHCAN_END代替。带有旧版�的 tp_dealloc 函数,例如:
static void mytype_dealloc(mytype *p) { PyObject_GC_UnTrack(p); Py_TRASHCAN_SAFE_BEGIN(p); ... Py_TRASHCAN_SAFE_END }
应当按照以下方��移到新版�:
static void mytype_dealloc(mytype *p) { PyObject_GC_UnTrack(p); Py_TRASHCAN_BEGIN(p, mytype_dealloc) ... Py_TRASHCAN_END }
请注�
Py_TRASHCAN_BEGIN的第二个å�‚数应该是它所属的å�–消分é…�函数。è¦�在å�Œä¸€ä»£ç �åº“ä¸æ”¯æŒ�旧版本的 Python,å�¯ä»¥å®šä¹‰ä»¥ä¸‹çš„å®�并在整个代ç �ä¸ä½¿ç”¨å®ƒä»¬ (版æ�ƒå£°æ˜Žï¼šè¿™äº›å®�是从
mypy代ç �åº“ä¸æ‹·è´�çš„):#if PY_VERSION_HEX >= 0x03080000 # define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_BEGIN(op, dealloc) # define CPy_TRASHCAN_END(op) Py_TRASHCAN_END #else # define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_SAFE_BEGIN(op) # define CPy_TRASHCAN_END(op) Py_TRASHCAN_SAFE_END(op) #endif
现在如果一个类型定义了
Py_TPFLAGS_HAVE_GCæ——æ ‡ä½†æ²¡æœ‰é��历函数 (PyTypeObject.tp_traverse) 则PyType_Ready()函数将引å�‘一个错误。 (由 Victor Stinner 在 bpo-44263 ä¸è´¡çŒ®ã€‚)带有
Py_TPFLAGS_IMMUTABLETYPEæ——æ ‡çš„å †ç±»åž‹çŽ°åœ¨å�¯ä»¥ç»§æ‰¿ PEP 590 vectorcall å��议。 在之å‰�版本ä¸ï¼Œè¿™å�ªé€‚用于 é�™æ€�类型。(由 Erlend E. Aasland 在 bpo-43908 ä¸è´¡çŒ®ã€‚)由于
Py_TYPE()已改为内è�”é�™æ€�å‡½æ•°ï¼Œå› æ¤Py_TYPE(obj) = new_typeå¿…é¡»æ�¢æˆ�Py_SET_TYPE(obj, new_type): å�‚è§�Py_SET_TYPE()函数(自 Python 3.9 èµ·å�¯ç”¨ï¼‰ã€‚ 为ä¿�æŒ�å�‘下兼容,å�¯ä»¥ä½¿ç”¨è¿™ä¸ªå®�:#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_TYPE) static inline void _Py_SET_TYPE(PyObject *ob, PyTypeObject *type) { ob->ob_type = type; } #define Py_SET_TYPE(ob, type) _Py_SET_TYPE((PyObject*)(ob), type) #endif
(由 Victor Stinner 在 bpo-39573 ä¸è´¡çŒ®ã€‚)
由于
Py_SIZE()已改为内è�”é�™æ€�å‡½æ•°ï¼Œå› æ¤Py_SIZE(obj) = new_sizeå¿…é¡»æ�¢æˆ�Py_SET_SIZE(obj, new_size): å�‚è§�Py_SET_SIZE()函数(自 Python 3.9 èµ·å�¯ç”¨ï¼‰ã€‚ 为ä¿�æŒ�å�‘下兼容,å�¯ä»¥ä½¿ç”¨è¿™ä¸ªå®�:#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_SIZE) static inline void _Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size) { ob->ob_size = size; } #define Py_SET_SIZE(ob, size) _Py_SET_SIZE((PyVarObject*)(ob), size) #endif
(由 Victor Stinner 在 bpo-39573 ä¸è´¡çŒ®ã€‚)
在
Py_LIMITED_APIå®�被设为0x030b0000(Python 3.11) 或更高版本时,<Python.h>å°†ä¸�å†�包å�«å¤´æ–‡ä»¶<stdlib.h>,<stdio.h>,<errno.h>å’Œ<string.h>。 C 扩展应在#include <Python.h>之å�Žæ˜¾å¼�地包括头文件。 (由 Victor Stinner 在 bpo-45434 ä¸è´¡çŒ®ã€‚)é�žå�—é™� API 文件
cellobject.h,classobject.h,code.h,context.h,funcobject.h,genobject.hå’Œlongintrepr.h已被移至Include/cpython目录。 æ¤å¤–,还移除了eval.h头文件。 这些文件ä¸�èƒ½è¢«ç›´æŽ¥åŒ…æ‹¬ï¼Œå› ä¸ºå®ƒä»¬å·²ç»�被包括在Python.hä¸äº†ï¼šå�‚è§� 包括文件。如果它们已被直接包括,请考虑改为包括Python.h。 (由 Victor Stinner 在 bpo-35134 ä¸è´¡çŒ®ã€‚)PyUnicode_CHECK_INTERNED()å®�已被排除在å�—é™� C API 之外。 å®ƒä»Žæœªåœ¨é‚£é‡Œè¢«ä½¿ç”¨ï¼Œå› ä¸ºå®ƒä½¿ç”¨äº†å�—é™� C API ä¸ä¸�å�¯ç”¨çš„内部结构体。 (由 Victor Stinner 在 bpo-46007 ä¸è´¡çŒ®ã€‚)以下帧函数和类型现在å�¯é€šè¿‡
#include <Python.h>直接使用,ä¸�å†�需è¦�æ·»åŠ#include <frameobject.h>:(由 Victor Stinner 在 gh-93937 ä¸è´¡çŒ®ã€‚)
PyFrameObject结构体æˆ�员已从公有 C API ä¸è¢«ç§»é™¤ã€‚虽然文档指出
PyFrameObjectå—æ®µå�¯èƒ½éš�æ—¶æ›´æ”¹ï¼Œä½†è¿™äº›å—æ®µé•¿æœŸä»¥æ�¥ä¸€ç›´ä¿�æŒ�稳定,并在多个æµ�行的扩展ä¸ä½¿ç”¨ã€‚在 Python 3.11 ä¸ï¼Œä¸ºäº†ä¼˜åŒ–性能,对帧结构进行了é‡�组。 ä¸€äº›å—æ®µè¢«å®Œå…¨åˆ é™¤ï¼Œå› ä¸ºå®ƒä»¬å±žäºŽæ—§å®žçŽ°çš„ç»†èŠ‚ã€‚
PyFrameObjectå—æ®µ:f_back: 使用PyFrame_GetBack()。f_blockstack: 已移除。f_builtins: 使用PyFrame_GetBuiltins()。f_code: 使用PyFrame_GetCode()。f_gen: 使用PyFrame_GetGenerator()。f_globals: 使用PyFrame_GetGlobals()。f_iblock: 已移除。f_lasti: 使用PyFrame_GetLasti()。 使用f_lasti并带有PyCode_Addr2Line()的代ç �应当改用PyFrame_GetLineNumber();它å�¯èƒ½ä¼šæ›´å¿«ã€‚f_lineno: 使用PyFrame_GetLineNumber()f_locals: 使用PyFrame_GetLocals()。f_stackdepth: 已移除。f_state: æ— å…¬å…± API (é‡�命å��为f_frame.f_state)。f_trace: æ— å…¬å…± API。f_trace_lines: 使用PyObject_GetAttrString((PyObject*)frame, "f_trace_lines")。f_trace_opcodes: 使用PyObject_GetAttrString((PyObject*)frame, "f_trace_opcodes")。f_localsplus: æ— å…¬å…± API (é‡�命å��为f_frame.localsplus)。f_valuestack: 已移除。
现在 Python 帧对象是惰性地创建的。 一个附带影�是
f_backæˆ�员ä¸�å�¯è¢«ç›´æŽ¥è®¿é—®ï¼Œå› 为现在它的值也是惰性地计算的。 必须改为调用PyFrame_GetBack()函数。直接访问
f_locals的调试器 必须 改为调用PyFrame_GetLocals()。 它们��需�调用PyFrame_FastToLocalsWithError()或PyFrame_LocalsToFast(),实际上它们�应调用这些函数。 现在帧所需�的更新将由虚拟机�管�。在 Python 3.8 �更旧版本上定义
PyFrame_GetCode()的代ç �:#if PY_VERSION_HEX < 0x030900B1 static inline PyCodeObject* PyFrame_GetCode(PyFrameObject *frame) { Py_INCREF(frame->f_code); return frame->f_code; } #endif
在 Python 3.8 �更旧版本上定义
PyFrame_GetBack()的代ç �:#if PY_VERSION_HEX < 0x030900B1 static inline PyFrameObject* PyFrame_GetBack(PyFrameObject *frame) { Py_XINCREF(frame->f_back); return frame->f_back; } #endif
或者使用 pythoncapi_compat 项目 在更旧版本的 Python 上获�这些函数。
PyThreadState结构体æˆ�员的å�˜åŒ–:frame: 已被移除,请使用PyThreadState_GetFrame()(ç”± bpo-40429 æ·»åŠ åˆ° Python 3.9 的函数)。 è¦å‘Šï¼šè¯¥å‡½æ•°è¿”回一个 strong reference,需è¦�调用Py_XDECREF()。tracing: 已被更改,请使用PyThreadState_EnterTracing()å’ŒPyThreadState_LeaveTracing()(ç”±:issue:43760 æ·»åŠ åˆ° Python 3.11 的函数)。recursion_depth: 已被移除,请使用(tstate->recursion_limit - tstate->recursion_remaining)代替。stackcheck_counter:已移除。
在 Python 3.8 或更旧版本ä¸å®šä¹‰
PyThreadState_GetFrame()的代ç �:#if PY_VERSION_HEX < 0x030900B1 static inline PyFrameObject* PyThreadState_GetFrame(PyThreadState *tstate) { Py_XINCREF(tstate->frame); return tstate->frame; } #endif
在 Python 3.10 或更旧版本ä¸å®šä¹‰
PyThreadState_EnterTracing()å’ŒPyThreadState_LeaveTracing()的代ç �:#if PY_VERSION_HEX < 0x030B00A2 static inline void PyThreadState_EnterTracing(PyThreadState *tstate) { tstate->tracing++; #if PY_VERSION_HEX >= 0x030A00A1 tstate->cframe->use_tracing = 0; #else tstate->use_tracing = 0; #endif } static inline void PyThreadState_LeaveTracing(PyThreadState *tstate) { int use_tracing = (tstate->c_tracefunc != NULL || tstate->c_profilefunc != NULL); tstate->tracing--; #if PY_VERSION_HEX >= 0x030A00A1 tstate->cframe->use_tracing = use_tracing; #else tstate->use_tracing = use_tracing; #endif } #endif
或者使用 pythoncapi-compat 项目 在旧版的 Python 函数上获�这些函数。
推��行方使用优化的 Blake2 库 libb2 �构建 Python。
现在�始化时
PyConfig.module_search_paths_setå—æ®µå¿…须设为 1 以使用PyConfig.module_search_pathsæ�¥åˆ�始化sys.path。 å�¦åˆ™ï¼Œåˆ�始化将é‡�新计算路径并替æ�¢ä»»ä½•åŠ å…¥åˆ°module_search_paths的值。PyConfig_Read()å°†ä¸�会å†�计算åˆ�å§‹æ�œç´¢è·¯å¾„,并且ä¸�会将任何值填充到PyConfig.module_search_paths。 è¦�计算默认路径å†�修改它们,请结æ�Ÿåˆ�始化并使用PySys_GetObject()æ�¥å°†sys.pathæ��å�–为一个 Python 列表对象并直接修改它。
弃用¶
弃用以下�置 Python �始化的函数:
PySys_AddWarnOptionUnicode()PySys_AddWarnOption()PySys_AddXOption()PySys_HasWarnOptions()PySys_SetArgvEx()PySys_SetArgv()PySys_SetPath()Py_SetPath()Py_SetProgramName()Py_SetPythonHome()Py_SetStandardStreamEncoding()_Py_SetProgramFullPath()
改用新的 Python �始化�置 的
PyConfigAPI (PEP 587)。 (由 Victor Stinner 在 gh-88279 ä¸è´¡çŒ®ã€‚)弃用
PyBytesObjectçš„ob_shashæˆ�员。 改用PyObject_Hash()。 (由 Inada Naoki 在 bpo-46864 ä¸è´¡çŒ®ã€‚).)
计划在 Python 3.12 ä¸ç§»é™¤Â¶
以下 C API 在早期 Python å�‘行版ä¸å·²ç»�弃用,将在 Python 3.12 ä¸ç§»é™¤ã€‚
PyUnicode_AS_DATA()PyUnicode_AS_UNICODE()PyUnicode_AsUnicodeAndSize()PyUnicode_AsUnicode()PyUnicode_FromUnicode()PyUnicode_GET_DATA_SIZE()PyUnicode_GET_SIZE()PyUnicode_GetSize()PyUnicode_IS_COMPACT()PyUnicode_IS_READY()PyUnicode_WSTR_LENGTH()_PyUnicode_AsUnicode()PyUnicode_WCHAR_KINDPyUnicode_InternImmortal()
移除¶
PyFrame_BlockSetup()å’ŒPyFrame_BlockPop()已被移除。 (由 Mark Shannon 在 bpo-40222 ä¸è´¡çŒ®ã€‚)移除了下列使用
errnoå�˜é‡�的数å¦å®�:Py_ADJUST_ERANGE1()Py_ADJUST_ERANGE2()Py_OVERFLOWED()Py_SET_ERANGE_IF_OVERFLOW()Py_SET_ERRNO_ON_MATH_ERROR()
(由 Victor Stinner 在 bpo-45412 ä¸è´¡çŒ®ã€‚)
移除
Py_UNICODE_COPY()å’ŒPy_UNICODE_FILL()å®�,它们自 Python 3.3 起已被弃用。 改用PyUnicode_CopyCharacters()或memcpy()(wchar_t*å—符串) å’ŒPyUnicode_Fill()函数。 (由 Victor Stinner 在 bpo-41123 ä¸è´¡çŒ®ã€‚)移除
pystrhex.h头文件。 它å�ªåŒ…å�«ç§�有函数。 C 扩展应当å�ªåŒ…括主<Python.h>头文件。 (由 Victor Stinner 在 bpo-45434 ä¸è´¡çŒ®ã€‚)移除了
Py_FORCE_DOUBLE()�,它曾�由Py_IS_INFINITY()�使用。(由 Victor Stinner 在 bpo-45440 贡献。)以下项目在
Py_LIMITED_API定义时���用:Py_MARSHAL_VERSION�
这些�是 �� API 的组�部分。
(由 Victor Stinner 在 bpo-45474 ä¸è´¡çŒ®ã€‚)
å°†
PyWeakref_GET_OBJECT()排除在å�—é™� C API 之外。 由于PyWeakReference结构体在å�—é™� C API ä¸è¢«å±�è”½å› æ¤å®ƒä»Žæœªå�‘挥作用。 (由 Victor Stinner 在 bpo-35134 ä¸è´¡çŒ®ã€‚)移除了
PyHeapType_GET_MEMBERS()å®�。它错误地暴露在公开的 C API ä¸ï¼Œä¸”å�ªèƒ½ç”± Python 在内部使用。请使用PyTypeObject.tp_members作为替代。(由 Victor Stinner 在 bpo-40170 贡献。)移除了
HAVE_PY_SET_53BIT_PRECISION�(移动到了内部 C API)。(由 Victor Stinner 在 bpo-45412 贡献。)
移除了
Py_UNICODEç¼–ç �器 API,它们从 Python 3.3 èµ·å·²ç»�弃用,很少使用,而且相对于推è��的替代å“�æ�¥è¯´ï¼Œæ•ˆçŽ‡å¾ˆä½Žã€‚è¢«ç§»é™¤çš„å‡½æ•°æœ‰:
PyUnicode_Encode()PyUnicode_EncodeASCII()PyUnicode_EncodeLatin1()PyUnicode_EncodeUTF7()PyUnicode_EncodeUTF8()PyUnicode_EncodeUTF16()PyUnicode_EncodeUTF32()PyUnicode_EncodeUnicodeEscape()PyUnicode_EncodeRawUnicodeEscape()PyUnicode_EncodeCharmap()PyUnicode_TranslateCharmap()PyUnicode_EncodeDecimal()PyUnicode_TransformDecimalToASCII()
请å�‚阅 PEP 624 了解细节以å�Š è¿�移指引。 (由 Inada Naoki 在 bpo-44029 ä¸è´¡çŒ®ã€‚)
3.11.4 ä¸çš„é‡�è¦�å�˜åŒ–¶
tarfile¶
tarfileä¸çš„æ��å�–方法和shutil.unpack_archive()都新增了 filter å�‚数以å…�许é™�制å�¯èƒ½ä»¤äººæ„�外或å�±é™©çš„ tar ç‰¹æ€§ï¼Œä¾‹å¦‚åœ¨ç›®æ ‡ç›®å½•ä¹‹å¤–åˆ›å»ºæ–‡ä»¶ã€‚ 相关细节å�‚è§� 解压缩过滤器。 在 Python 3.12 ä¸ï¼Œä¸�带 filter å�‚数的用法将显示DeprecationWarning。 在 Python 3.14 ä¸ï¼Œé»˜è®¤å€¼å°†åˆ‡æ�¢ä¸º'data'。 (由 Petr Viktorin 在 PEP 706 ä¸è´¡çŒ®ã€‚)
3.11.5 ä¸çš„é‡�è¦�å�˜åŒ–¶
OpenSSL¶
�自 python.org 的 Windows 版本和 macOS 安装程�现在使用 OpenSSL 3.0。