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 一节。

新的语法特性:

新的内置特性:

新的标准库模�:

  • PEP 680: tomllib — 标准库中对解æž� TOML 的支æŒ�

解释器的改进:

新的类型标注特性:

��的弃用�移除或�制:

新的特性¶

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 指令 与�代��置相关�。 �以使用以下方�获�此信�:

更多细节请�� 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 �编译中包括了这个�缀。

其他语言特性修改¶

  • 增加了 -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 的缓解方案。这个é™�制å�¯ä»¥é€šè¿‡çŽ¯å¢ƒå�˜é‡�ã€�命令行旗标或 sys API 进行é…�置或ç¦�用。å�‚è§� integer string conversion length limitation 文档。默认é™�制是字符串形å¼�çš„ 4300 ä½�数字。

新增模�¶

  • tomllib: 用于解æž� TOML。 请å�‚阅 PEP 680 了解详情。 (由 Taneli Hukkinen 在 bpo-40059 中贡献。)

  • wsgiref.types: 用于表æ€�类型检查的 WSGI 专属类型。 (由 Sebastian Rittau 在 bpo-42012 中贡献。)

改进的模�¶

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¶

  • 增加了é�žå¹¶è¡Œå®‰å…¨çš„ chdir() 上下文管ç�†å™¨ç”¨æ�¥æ”¹å�˜å½“å‰�工作目录并在退出时æ�¢å¤�它。 是 chdir() 的简å�•包装器。 (由 Filipe Laíns 在 bpo-25625 中贡献))

dataclasses¶

  • 修改了字段默认的å�¯å�˜æ€§æ£€æŸ¥ï¼Œé»˜è®¤ä»…å…�许 hashable 而é�žä»»ä½•ä¸�为 dict, list 或 set 实例的对象。 (由 Eric V. Smith 在 bpo-44674 中贡献。)

datetime¶

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¶

  • 支æŒ�基于字符串执行 PEP 515 网络的 Fraction åˆ�始化。 (由 Sergey B Kirpichev 在 bpo-44258 中贡献。)

  • Fraction 现在实现了一个 __int__ 方法,因而 isinstance(some_fraction, typing.SupportsInt) 检测将会通过。 (由 Mark Dickinson 在 bpo-44547 中贡献。)

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¶

  • 对 .pyi 文件应用语法高亮。 (由 Alex Waygood å’Œ Terry Jan Reedy 在 bpo-45447 中贡献。)

  • 当附带输入和输出地ä¿�å­˜ Shell 时将包括æ��示符。 (由 Terry Jan Reedy 在 gh-95191 中贡献。)

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¶

  • glob() å’Œ rglob() 在 pattern 以路径组件分隔符å�³ sep 或 altsep 结æ�Ÿæ—¶å°†å�ªè¿”回目录。 (由 Eisuke Kawasima 在 bpo-22276 å’Œ bpo-33392 中贡献。)

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 中贡献。)

  • 现在 sqlite3 C 回调会在å�¯ç”¨äº†å›žè°ƒå›žæº¯çš„æƒ…况下使用ä¸�å�¯å¼•å�‘的异常。 用户现在å�¯ä»¥æ³¨å†Œ ä¸�å�¯å¼•å�‘的钩å­�处ç�†å�¥æŸ„ æ�¥æ��å�‡å…¶è°ƒè¯•体验。 (由 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¶

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 �供了�外的帮助。)

�算

形�

专门化

�行加速(最高)

贡献者

�目�算

x + x

x - x

x * x

常�类型如 int, float 和 str 的�目加法�乘法和�法将采用针对其下层类型专门定制的快速路径。

10%

Mark Shannon, Donghee Na, Brandt Bucher, Dennis Sweeney

下标

a[i]

对容器类型如 list, tuple 和 dict 的下标�作将直接索引下层数�结构。

对自定义 __getitem__() 的下标�作也是采用类似于 内�的 Python 函数调用 的内�方�。

10-25%

Irit Katriel, Mark Shannon

存储下标�作

a[i] = z

类似于上述的下标�作专门化。

10-25%

Dennis Sweeney

调用

f(arg)

C(arg)

对常用内置 (C) 函数和类型如 len() 和 str 的调用将直接调用其下层 C 版本。 这将���历内部调用�程。

20%

Mark Shannon, Ken Jin

加载全局��

print

len

对象在全局/内置命�空间中的索引会被缓存。 加载全局和内置��将�需�命�空间查找过程。

[1]

Mark Shannon

加载属性

o.attr

类似于加载全局��。 属性在类/对象命�空间中的索引会被缓存。 在大多数情况下,加载属性将�需�命�空间查找过程。

[2]

Mark Shannon

加载�调用的方法

o.meth()

方法的实际地�会被缓存。 加载方法现在将�需�命�空间查找过程 -- �使对于具有较长继承链的类�说也是如此。

10-20%

Ken Jin, Mark Shannon

存储属性

o.attr = z

类似于加载属性的优化。

2% 的�行效率

Mark Shannon

解包�列

*seq

针对常�容器如 list 和 tuple 进行了专门化。 ��内部调用�程。

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_*

BINARY_OP

用�个�作�替�所有数值类�目/原地�作�

CALL_FUNCTION
CALL_FUNCTION_KW
CALL_METHOD
KW_NAMES
PRECALL

对方法的�数��与关键字�数的处�进行解�;�许更好的调用特化

DUP_TOP
DUP_TOP_TWO
ROT_TWO
ROT_THREE
ROT_FOUR
ROT_N

栈�纵指令

JUMP_IF_NOT_EXC_MATCH

现在会执行检查但�会跳转

JUMP_ABSOLUTE
POP_JUMP_IF_FALSE
POP_JUMP_IF_TRUE
POP_JUMP_BACKWARD_IF_*
POP_JUMP_FORWARD_IF_*

�� [3]; 针对�个方�的 TRUE, FALSE, NONE 和 NOT_NONE ��

SETUP_WITH
SETUP_ASYNC_WITH

BEFORE_WITH

with 代��设置

修改/移除的�作�¶

  • 修改 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 中被移除:

    aifc

    chunk

    msilib

    pipes

    telnetlib

    audioop

    crypt

    nis

    sndhdr

    uu

    cgi

    imghdr

    nntplib

    spwd

    xdrlib

    cgitb

    mailcap

    ossaudiodev

    sunau

    (由 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 模å�—

  • 整个 distutils 包

  • 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.ImpImporter

  • pkgutil.ImpLoader

  • pathlib.Path.link_to()

  • sqlite3.enable_shared_cache()

  • sqlite3.OptimizedUnicode()

  • PYTHONTHREADDEBUG 环境å�˜é‡�

  • The following deprecated aliases in unittest 中的下列已弃用别å��:

    已弃用的别�

    方法�

    弃用于

    failUnless

    assertTrue()

    3.1

    failIf

    assertFalse()

    3.1

    failUnlessEqual

    assertEqual()

    3.1

    failIfEqual

    assertNotEqual()

    3.1

    failUnlessAlmostEqual

    assertAlmostEqual()

    3.1

    failIfAlmostEqual

    assertNotAlmostEqual()

    3.1

    failUnlessRaises

    assertRaises()

    3.1

    assert_

    assertTrue()

    3.2

    assertEquals

    assertEqual()

    3.2

    assertNotEquals

    assertNotEqual()

    3.2

    assertAlmostEquals

    assertAlmostEqual()

    3.2

    assertNotAlmostEquals

    assertNotAlmostEqual()

    3.2

    assertRegexpMatches

    assertRegex()

    3.2

    assertRaisesRegexp

    assertRaisesRegex()

    3.2

    assertNotRegexpMatches

    assertNotRegex()

    3.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 起已弃用的 distutils bdist_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 的�化¶

新的特性¶

移�到 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 �始化�置 的 PyConfig API (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_READY()

  • PyUnicode_WSTR_LENGTH()

  • _PyUnicode_AsUnicode()

  • PyUnicode_WCHAR_KIND

  • PyUnicodeObject

  • PyUnicode_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 定义时ä¸�å†�å�¯ç”¨ï¼š

    这些�是 �� 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。