Python 3.12 有什么新�化¶

编者:

Adam Turner

本文介� Python 3.12 相比 3.11 增加的新特性。 Python 3.12 已于 2023 年 10 月 2 日�布。 �获�详细信�,��阅 changelog。

��

PEP 693 -- Python 3.12 �布计划

摘� -- �布�点¶

Python 3.12 是 Python 编程语言的最新稳定�布版,包�一系列对语言和标准库的改�。 库的改�主�集中在清�已弃用的 API��用性和正确性等方�。 值得注�的是,distutils 包已从标准库中移除。 os 和 pathlib 中的文件系统支�增加了许多改进,而且部分模�的性能也获得了��。

语言的改�主�集中在�用性方�,如 f-字符串 的许多�制已被移除,而 'Did you mean ...' �示消�继续得到改进。 新的 类型形�语法 和 type 语���了 泛型类型 和 类型别� ����类型检查器使用时的效率。

本文并�试图�供所有新功能的完整规范说明,而是�供一个方便的概览。 如需了解完整细节,请�阅相应文档,如 标准库�考 和 语言�考。 如果你想了解�项改�的完整实现和设计�念,请�阅相应新特性的 PEP;但请注�一旦�项特性已完全实现则相应 PEP 通常�会�继续更新。


新的语法特性:

  • PEP 695,类型形å�‚语法和 type 语å�¥

新的语法特性:

解释器的改进:

对 Python 数�模型的改进:

标准库中的�大改进:

  • pathlib.Path 类现在支æŒ�å­�类化

  • os 模å�—获得了多项针对 Windows 支æŒ�的改进

  • 在 sqlite3 模å�—中添加了 命令行界é�¢ã€‚

  • 基于 è¿�行时å�¯æ£€æµ‹å��è®® çš„ isinstance() 检测获得了 2 至 20 å€�çš„æ��速

  • asyncio 包的性能获得了多项改进,一些基准测试显示有 75% çš„æ��速。

  • 在 uuid 模å�—中添加了 命令行界é�¢ã€‚

  • 由于 PEP 701 中的更改,通过 tokenize 模å�—生æˆ�令牌(token)的速度最多å�¯æ��高 64%。

安全改进:

  • 用æ�¥è‡ª HACL* 项目的ç»�过正å¼�验è¯�的代ç �替代 SHA1, SHA3, SHA2-384, SHA2-512 å’Œ MD5 的内置 hashlib 实现。 这些内置实现ä¿�留作为仅在当 OpenSSL 未æ��供它们时使用的回退选项。

C API 的改进:

  • PEP 697,ä¸�稳定 C API 层

  • PEP 683,永生对象

CPython 实现的改进:

  • PEP 709,推导å¼�内è�”化

  • 对 Linux perf 性能分æž�器的 CPython 支æŒ�

  • 在å�—支æŒ�的平å�°ä¸Šå®žçŽ°æ ˆæº¢å‡ºä¿�护

新的类型标注特性:

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

  • PEP 623: 在 Python çš„ C API 中移除 Unicode 对象中的 wstr,使æ¯�个 str 对象的大å°�缩å‡�至少 8 个字节。

  • PEP 632: 移除 distutils 包。 请å�‚阅 è¿�移指å�— 了解有关替æ�¢å…¶æ‰€æ��供的 API 的建议。 第三方 Setuptools 包将继续æ��ä¾› distutils,如果你在 Python 3.12 å�Šæ›´é«˜ç‰ˆæœ¬ä¸­ä»�然需è¦�它的è¯�。

  • gh-95299: ä¸�在使用 venv 创建的虚拟环境中预装 setuptools。 è¿™æ„�味ç�€ distutilsã€�setuptoolsã€�pkg_resources å’Œ easy_install 默认将ä¸�å†�å�¯ç”¨ï¼›è¦�访问这些工具请在 激活的 虚拟环境中è¿�行 pip install setuptools。

  • 移除了 asynchatã€�asyncore å’Œ imp 模å�—,以å�Šä¸€äº› unittest.TestCase 方法别å��。

新的特性¶

PEP 695: 类型形�语法¶

PEP 484 下的泛型类和函数是使用详细语法声明的,这使得类型�数的范围�明确,并且需�显�声明�化。

PEP 695 引入了一�新的�更紧凑�更明确的方��创建 泛型类 和 函数:

def max[T](args: Iterable[T]) -> T:
    ...

class list[T]:
    def __getitem__(self, index: int, /) -> T:
        ...

    def append(self, element: T) -> None:
        ...

此外,该 PEP 引入了一�新的方法�使用 type 语�声明 类型别�,该语�会创建 TypeAliasType 的实例:

type Point = tuple[float, float]

类型别�也�以是 generic:

type Point[T] = tuple[T, T]

新语法�许声明 TypeVarTuple 和 ParamSpec 形�,以�带边界或约�的 TypeVar 形�:

type IntFunc[**P] = Callable[P, int]  # ParamSpec
type LabeledTuple[*Ts] = tuple[str, *Ts]  # TypeVarTuple
type HashableSequence[T: Hashable] = Sequence[T]  # TypeVar with bound
type IntOrStrSequence[T: (int, str)] = Sequence[T]  # TypeVar with constraints

类型别�的值以�通过此语法创建的类型��的边界和约�仅在需�时�进行求值 (�� 惰性求值)。 这�味�类型别��以引用��在文件中定义的其他类型。

通过类型�数列表声明的类型�数在声明的作用域和任何嵌套的作用域内都��,但在外部作用域内���。 例如,它们�以用于泛型类的方法的类型注解或类体中。 但是,在定义类之�,�能在模�范围中使用它们。 有关类型�数的�行时语义的详细�述,请�� 类型形�列表。

为了支�这些作用域定义,引入了一�新的作用域,� 标注作用域。 标注作用域的行为在很大程度上类似于函数作用域,但与�闭类作用作用域的交互方���。 在 Python 3.13 中,标注 也将在标注作用域中进行求值。

更多细节请�� PEP 695。

(PEP由 Eric Traut 撰写。 由 Jelle Zijlstra�Eric Traut 和其他人在 gh-103764 中实现。)

PEP 701:f-字符串的�法形�化¶

PEP 701 �消了对 f-字符串 使用的一些�制。 f-字符串内部的表达�部分现在�以是任何有效的 Python 表达�,包括�用了与标记 f-字符串本身相�的引�的字符串�多行表达��注释��斜�以� unicode 转义�列。 让我们详细介�一下:

  • 引å�·é‡�用:在 Python 3.11 中,é‡�用与标记 f-字符串本身相å�Œçš„引å�·ä¼šå¼•å�‘ SyntaxError,迫使用户使用其他å�¯ç”¨çš„引å�·ï¼ˆå¦‚在 f-字符串使用å�•引å�·æ—¶ä½¿ç”¨å�Œå¼•å�·æˆ–三é‡�引å�·ï¼‰ã€‚ 在 Python 3.12 中,你现在å�¯ä»¥è¿™æ ·å�šäº†ï¼š

    >>> songs = ['Take me back to Eden', 'Alkaline', 'Ascensionism']
    >>> f"This is the playlist: {", ".join(songs)}"
    'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'
    

    请注�,在这一更改之�,对f-字符串的嵌套方�没有明确的�制,但字符串引��能在f-字符串的表达�组件中��使用,这使得��能任�嵌套f-字符串。事实上,这是�以编写的嵌套最多的f-字符串:

    >>> f"""{f'''{f'{f"{1+1}"}'}'''}"""
    '2'
    

    由于现在f-字符串�以在表达�组件中包�任何有效的Python表达�,因此现在�以任�嵌套f-字符串:

    >>> f"{f"{f"{f"{f"{f"{1+1}"}"}"}"}"}"
    '2'
    
  • 多行表达å¼�和注释:在 Python 3.11 中,f-字符串表达å¼�必须在一行中完æˆ�定义,å�³ä½¿ f-字符串中的表达å¼�在正常情况下å�¯ä»¥è·¨å¤šè¡Œï¼ˆå¦‚在多行中定义的列表字é�¢å€¼ï¼‰ï¼Œè¿™ä½¿å¾—它们更难被读懂。 在 Python 3.12 中,你现在å�¯ä»¥å®šä¹‰è·¨è¶Šå¤šè¡Œçš„ f-字符串并添加内è�”注释:

    >>> f"This is the playlist: {", ".join([
    ...     'Take me back to Eden',  # My, my, those eyes like fire
    ...     'Alkaline',              # Not acid nor alkaline
    ...     'Ascensionism'           # Take to the broken skies at last
    ... ])}"
    'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'
    
  • å��æ–œæ� å’Œ unicode 字符:在 Python 3.12 之å‰�,f-字符串表达å¼�ä¸�能包å�«ä»»ä½• \ 字符。 这也影å“�了 unicode 转义åº�列 (如 \N{snowman}),因为这些åº�列包å�« \N 部分,而这部分以å‰�ä¸�能作为 f-字符串表达å¼�组件的一部分。 现在,你å�¯ä»¥è¿™æ ·å®šä¹‰è¡¨è¾¾å¼�:

    >>> print(f"This is the playlist: {"\n".join(songs)}")
    This is the playlist: Take me back to Eden
    Alkaline
    Ascensionism
    >>> print(f"This is the playlist: {"\N{BLACK HEART SUIT}".join(songs)}")
    This is the playlist: Take me back to Eden♥Alkaline♥Ascensionism
    

更多细节请�� PEP 701。

实现此特性的一个正�的附带影�是(通过使用 PEG 解�器 �解� f-字符串),现在 f-字符串的错误消�会更加精确,包括错误的确切�置。例如,在 Python 3.11 中,下�的 f-字符串将引�一个 SyntaxError :

>>> my_string = f"{x z y}" + f"{1 + 1}"
  File "<stdin>", line 1
    (x z y)
     ^^^
SyntaxError: f-string: invalid syntax. Perhaps you forgot a comma?

但是错误消��包括错误在行中的确切�置,而且表达�被人为地用括�括起�。在Python 3.12中,由于f-字符串是用PEG解�器解�的,因此错误消��以更精确,并显示整行:

>>> my_string = f"{x z y}" + f"{1 + 1}"
  File "<stdin>", line 1
    my_string = f"{x z y}" + f"{1 + 1}"
                   ^^^
SyntaxError: invalid syntax. Perhaps you forgot a comma?

(由 Pablo Galindo�Batuhan Taskaya� Lysandros Nikolaou�Cristián Maureira-Fredes 和 Marta Gómez 在 gh-102856 中贡献。 PEP 由 Pablo Galindo� Batuhan Taskaya� Lysandros Nikolaou 和 Marta Gómez 撰写)。

PEP 684: 解释器级 GIL¶

PEP 684 引入了解释器级的 GIL,使得现在�以创建带有独立的解释器级 GIL 的�解释器。 这将�许 Python 程�充分利用多个 CPU 核心。 此特性目�仅能通过 C-API 使用,�过相应的 Python API 预计将在 3.13 中添加。

使用新的 Py_NewInterpreterFromConfig() 函数�创建具有�独 GIL 的解释器:

PyInterpreterConfig config = {
    .check_multi_interp_extensions = 1,
    .gil = PyInterpreterConfig_OWN_GIL,
};
PyThreadState *tstate = NULL;
PyStatus status = Py_NewInterpreterFromConfig(&tstate, &config);
if (PyStatus_Exception(status)) {
    return -1;
}
/* The new interpreter is now active in the current thread. */

有关如何将 C-API 用于�解释器和解释器级 GIL 的更多示例,请�� Modules/_xxsubinterpretersmodule.c。

(由 Eric Snow 在 gh-104210 等中贡献。)

PEP 669:针对 CPython 的低影�监控¶

PEP 669 定义了一个新的 API 用于性能分�器�调试器和其他在 CPython 中监控事件的工具。 它覆盖了大范围的事件,包括调用�返回�行�异常�跳转等等。 这�味�你将�为你所使用的东西付出开销,�供了对近乎零开销的调试器和覆盖工具的支�。 请�阅 sys.monitoring 了解详情。

(由 Mark Shannon 在 gh-103082 中贡献。)

PEP 688: 使缓冲区�议在Python中�访问¶

PEP 688 引入了一�在 Python 代�中使用 缓冲区�议 的方法。实现 __buffer__() 方法的类现在�以作为缓冲区类型使用。

新的 collections.abc.Buffer ABC(抽象基类)�供了一�表示缓冲区对象的标准方法,例如在类型注释中。 新的 inspect.BufferFlags 枚举表示�用于自定义缓冲区创建的标志。 (由 Jelle Zijlstra 在 gh-102500 中贡献。)

PEP 709:推导�内�¶

字典�列表和集�推导�现在都是内�的,而�是为�次执行推导�都创建一个新的一次性函数对象。 这样�以将推导�的执行速度�高最多两�。 更多细节请�阅 PEP 709。

推导�迭代��将��隔离而�会覆盖外作用域中的����,在离开推导��也����。 内�确实会导致一些��的行为�化:

  • 回溯中的推导å¼�ä¸�å†�有å�•独的帧,跟踪/评测也ä¸�å†�将推导å¼�显示为函数调用。

  • symtable 模å�—å°†ä¸�å†�为æ¯�个推导å¼�产生å­�符å�·è¡¨ï¼›å�–而代之的是,推导å¼�çš„ locals 将包括在父函数的符å�·è¡¨ä¸­ã€‚

  • 在推导å¼�内部调用 locals() 现在包括该推导å¼�外部外部的å�˜é‡�,而ä¸�å†�包括推导å¼�“å�‚æ•°â€�导致的 .0 å�ˆæˆ�å�˜é‡�。

  • 一个直接迭代 locals() 的推导å¼� (例如 [k for k in locals()]) 在å�¯åŠ¨è¿½è¸ª (例如检测代ç �覆盖度) 的情况下è¿�行时å�¯èƒ½å¯¼è‡´ "RuntimeError: dictionary changed size during iteration"。 此行为与现有的 for k in locals(): 等代ç �ä¿�æŒ�一致。 è¦�é�¿å…�此错误,å�¯å…ˆåˆ›å»ºä¸€ä¸ªç”±é”®ç»„æˆ�的列表用于迭代: keys = list(locals()); [k for k in keys]。

(由 Carl Meyer 和 Vladimir Matveev 在 PEP 709 中贡献。)

改进的错误消�¶

  • 当引å�‘çš„ NameError 传播到最高层级时,解释器显示的错误消æ�¯å�¯èƒ½å°†æ ‡å‡†åº“中的模å�—作为建议的一部分。 (由 Pablo Galindo 在 gh-98254 中贡献。)

    >>> sys.version_info
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'sys' is not defined. Did you forget to import 'sys'?
    
  • 改进针对实例的 NameError 异常的错误建议。 现在如果在方法中引å�‘了 NameError 而实例具有与异常中的å��称完全相å�Œçš„属性,建议将会包括 self.<NAME> 而ä¸�是方法作用域中最接近的匹é…�项。 (由 Pablo Galindo 在 gh-99139 中贡献。)

    >>> class A:
    ...    def __init__(self):
    ...        self.blech = 1
    ...
    ...    def foo(self):
    ...        somethin = blech
    ...
    >>> A().foo()
    Traceback (most recent call last):
      File "<stdin>", line 1
        somethin = blech
                   ^^^^^
    NameError: name 'blech' is not defined. Did you mean: 'self.blech'?
    
  • 改进了当用户输入 import x from y 而ä¸�是 from y import x 时产生的 SyntaxError 错误消æ�¯ã€‚ (由 Pablo Galindo 在 gh-98931 中贡献。)

    >>> import a.y.z from b.y.z
    Traceback (most recent call last):
      File "<stdin>", line 1
        import a.y.z from b.y.z
        ^^^^^^^^^^^^^^^^^^^^^^^
    SyntaxError: Did you mean to use 'from ... import ...' instead?
    
  • 由失败的 from <module> import <name> 语å�¥å¼•å�‘çš„ ImportError 异常现在会包括根æ�® <module> 中的å�¯ç”¨å��称对 <name> 的值æ��出的建议。 (由 Pablo Galindo 在 gh-91058 中贡献。)

    >>> from collections import chainmap
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ImportError: cannot import name 'chainmap' from 'collections'. Did you mean: 'ChainMap'?
    

其他语言特性修改¶

  • è§£æž�器现在在解æž�包å�«ç©ºå­—节的æº�代ç �时引å�‘ SyntaxError。 (由 Pablo Galindo 在 gh-96670 中贡献 。)

  • ä¸�是有效转义åº�列的å��æ–œæ� åŠ å­—ç¬¦ç»„å�ˆçŽ°åœ¨ä¼šç”Ÿæˆ� SyntaxWarning,而ä¸�是 DeprecationWarning。 例如,re.compile("\d+\.\d+") 现在会å�‘出 SyntaxWarning ("\d" 是一个无效的转义åº�列,请使用原始字符串æ�¥è¡¨ç¤ºæ­£åˆ™è¡¨è¾¾å¼�: re.compile(r"\d+\.\d+"))。 在未æ�¥çš„ Python 版本中,最终将引å�‘ SyntaxError,而ä¸�是 SyntaxWarning。 (由 Victor Stinner 在 gh-98401 中贡献。)

  • 值大于 0o377 (例如: "\477") 的八进制转义åº�列,在 Python 3.11 中已弃用,现在会产生 SyntaxWarning,而ä¸�是 DeprecationWarning。 在未æ�¥çš„ Python 版本中,它们最终将是 SyntaxError。 (由 Victor Stinner 在 gh-98401 中贡献。)

  • 未存储在推导å¼�目标部分中的å�˜é‡�现在å�¯ä»¥åœ¨èµ‹å€¼è¡¨è¾¾å¼� (:=) 中使用。 例如,在 [(b := 1) for a, b.prop in some_iter] 中,现在å…�许对 b 进行赋值。 请注æ„�,根æ�® PEP 572,ä»�ç„¶ä¸�å…�许å�‘存储在推导å¼�目标部分中的å�˜é‡� (如 a) 赋值。 (由 Nikita Sobolev 在 gh-100581 中贡献。)

  • 在类或类型对象的 __set_name__ 方法中引å�‘的异常ä¸�å†�ç”± RuntimeError æ�¥åŒ…装。 上下文信æ�¯å°†ä½œä¸º PEP 678 注释添加到异常中。 (由 Irit Katriel 在 gh-77757 中贡献。)

  • 当 try-except* 构造处ç�†æ•´ä¸ª ExceptionGroup 并引å�‘å�¦ä¸€ä¸ªå¼‚常时,该异常ä¸�å†�å°�装在 ExceptionGroup 中。 在 3.11.4 版中也进行了更改。 (由 Irit Katriel 在 gh-103590 中贡献。)

  • 垃圾回收器现在å�ªåœ¨ Python 字节ç �评估循环的 eval-breaker 机制上è¿�行,而ä¸�是在对象分é…�上è¿�行。 垃圾回收也å�¯ä»¥åœ¨è°ƒç”¨ PyErr_CheckSignals() æ—¶è¿�行,因此需è¦�é•¿æ—¶é—´è¿�行而ä¸�执行任何 Python 代ç �çš„ C 扩展也有机会定期执行垃圾回收。 (由 Pablo Galindo 在 gh-97922 中贡献。)

  • 所有期望布尔å�‚数的内置和扩展å�¯è°ƒç”¨å‡½æ•°çŽ°åœ¨éƒ½æŽ¥å�—任何类型的å�‚数,而ä¸�仅仅是 bool å’Œ int。 (由 Serhiy Storchaka 在 gh-60203 中贡献。)

  • memoryview 现在支æŒ�å�Šç²¾åº¦æµ®ç‚¹ç±»åž‹ï¼ˆ"e" æ ¼å¼�代ç �)。 (由 Donghee Na å’Œ Antoine Pitrou 在 gh-90751 中贡献。)

  • slice 对象现在是å�¯å“ˆå¸Œçš„,å…�许它们用作字典的键和集å�ˆé¡¹ã€‚ (由 Will Bradshawã€�Furkan Onder å’Œ Raymond Hettinger 在 gh-101264 中贡献。)

  • sum() 现在使用 Neumaier 求和算法以改善对浮点数或混å�ˆäº†æ•´æ•°å’Œæµ®ç‚¹æ•°æ—¶æ±‚å’Œè¿�算的准确性和å�¯æ�¢ç®—性。 (由 Raymond Hettinger 在 gh-100425 中贡献。)

  • ast.parse() 现在会在解æž�包å�«ç©ºå­—节的æº�代ç �时引å�‘ SyntaxError 而ä¸�是 ValueError。 (由 Pablo Galindo 在 gh-96670 中贡献 。)

  • tarfile 中的æ��å�–方法和 shutil.unpack_archive() 有一个新的 filter å�‚数,它å…�许é™�制å�¯èƒ½ä»¤äººæƒŠè®¶æˆ–å�±é™©çš„ tar 功能,例如在目标目录之外创建文件。 相关细节请å�‚阅 tarfile æ��å�–过滤器。 在 Python 3.14 中。默认值将切æ�¢ä¸º 'data'。 (由 Petr Viktorin 在 PEP 706 中贡献。)

  • 如果底层映射是å�¯å“ˆå¸Œçš„,那么 types.MappingProxyType 实例现在是å�¯å“ˆå¸Œçš„。 (由 Serhiy Storchaka 在 gh-87995 中贡献。)

  • 通过新的环境å�˜é‡� PYTHONPERFSUPPORT 和命令行选项 -X perf 以å�Šæ–°çš„ sys.activate_stack_trampoline(), sys.deactivate_stack_trampoline() å’Œ sys.is_stack_trampoline_active() 函数添加了对 perf 性能分æž�器的支æŒ�。 (由 Pablo Galindo 设计。 ç”± Pablo Galindo å’Œ Christian Heimes 在 gh-96123 中贡献并包å�«æ�¥è‡ª Gregory P. Smith [Google] å’Œ Mark Shannon 的帮助。)

新增模�¶

  • 无。

改进的模�¶

array¶

  • array.array 类现在支æŒ�下标,使其æˆ�为 generic type。 (由 Jelle Zijlstra 在 gh-98658 中贡献。)

asyncio¶

  • 在 asyncio 中写入套接字的性能得到了显著æ��高。 asyncio 现在å�¯ä»¥é�¿å…�在写入套接字时进行ä¸�å¿…è¦�çš„å¤�制,并在平å�°æ”¯æŒ�的情况下使用 sendmsg()。 (由 Kumar Aditya 在 gh-91166 中贡献。)

  • 添加了 asyncio.eager_task_factory() å’Œ asyncio.create_eager_task_factory() 函数以å…�许在主动型任务执行中选择事件循环,使æŸ�些用例的速度æ��å�‡äº† 2 至 5 å€�。 (由 Jacob Bower å’Œ Itamar Oren 在 gh-102853, gh-104140 å’Œ gh-104138 中贡献。)

  • 在 Linux 上,如果 os.pidfd_open() å�¯ç”¨ä¸”能工作则 asyncio 默认会使用 asyncio.PidfdChildWatcher 而ä¸�是 asyncio.ThreadedChildWatcher。 (由 Kumar Aditya 在 gh-98024 中贡献。)

  • 现在事件循环会针对æ¯�个平å�°ä½¿ç”¨æœ€ä½³çš„å�¯ç”¨å­�监视器 (在å�—支æŒ�的情况下使用 asyncio.PidfdChildWatcher,å�¦åˆ™ä½¿ç”¨ asyncio.ThreadedChildWatcher),因此ä¸�建议手动é…�ç½®å­�监视器。 (由 Kumar Aditya 在 gh-94597 中贡献。)

  • 为 asyncio.run() 添加了形å�‚ loop_factory,以å…�许指定自定义事件循环工厂。 (由 Kumar Aditya 在 gh-99388 中贡献。)

  • 添加了 asyncio.current_task() çš„ C 实现以实现 4 - 6 å€�的加速。 (由 Itamar Oren å’Œ Pranav Thulasiram Bhat 在 gh-100344 中贡献。)

  • asyncio.iscoroutine() 现在为生æˆ�器返回 False,因为 asyncio ä¸�支æŒ�传统的基于生æˆ�器的å��程。 (由 Kumar Aditya 在 gh-102748 中贡献。)

  • asyncio.wait() å’Œ asyncio.as_completed() 现在接å�—生æˆ�器 yield 任务。 (由 Kumar Aditya 在 gh-78530 中贡献。)

calendar¶

  • 添加了枚举 calendar.Month å’Œ calendar.Day æ�¥å®šä¹‰å¹´ä»½ä¸­çš„æ¯�一月和星期中的æ¯�一日。 (由 Prince Roshan 在 gh-103636 中贡献。)

csv¶

  • 增加了 csv.QUOTE_NOTNULL å’Œ csv.QUOTE_STRINGS 旗标以通过 csv.writer 对象æ�¥æ��供对 None 和空字符串的更细粒度控制。

dis¶

  • 伪指令æ“�作ç �(由编译器使用但ä¸�会出现在å�¯æ‰§è¡Œå­—节ç �中)现在将暴露在 dis 模å�—中。 HAVE_ARGUMENT ä»�然与实际的æ“�作ç �相关,但对伪指令æ�¥è¯´æ²¡æœ‰ç”¨å¤„。 请改用新的 dis.hasarg 多项集。 (由 Irit Katriel 在 gh-94216 中贡献。)

  • 添加了 dis.hasexc 多项集æ�¥è¡¨ç¤ºè®¾ç½®å¼‚常处ç�†å�¥æŸ„的指令。 (由 Irit Katriel 在 gh-94216 中贡献。)

fractions¶

  • 类型为 fractions.Fraction 的对象现在支æŒ�浮点格å¼�。 (由 Mark Dickinson 在 gh-100161 中贡献。)

importlib.resources¶

  • importlib.resources.as_file() 现在将支æŒ�资æº�目录。 (由 Jason R. Coombs 在 gh-97930 中贡献。)

  • å°† importlib.resources.files() 的第一个形å�‚é‡�命å��为 anchor。 (由 Jason R. Coombs 在 gh-100598 中贡献。)

inspect¶

  • 添加 inspect.markcoroutinefunction() æ�¥æ ‡è®°è¿”回 coroutine çš„å�Œæ­¥å‡½æ•°ï¼Œä»¥ä¾¿ä¸Ž inspect.iscoroutinefunction() 一起使用。 (由 Carlton Gibson 在 gh-99247 中贡献。)

  • 添加 inspect.getasyncgenstate() å’Œ inspect.getasyncgenlocals() 用æ�¥ç¡®å®šå¼‚æ­¥å�‘生器的当å‰�状æ€�。 (由 Thomas Krennwallner 在 gh-79940 中贡献。)

  • inspect.getattr_static() 的性能得到了相当大的改进。 对函数的大多数调用应该比 Python 3.11 中至少快 2 å€�,有些å�¯èƒ½å¿« 6 å€�甚至更多。 (由 Alex Waygood 在 gh-103193 中贡献。)

itertools¶

  • 增加了 itertools.batched() 用æ�¥å°†æ•°æ�®æ”¶é›†ä¸ºç›¸å�Œå¤§å°�的元组,其中最å�Žä¸€ä¸ªæ‰¹æ¬¡çš„长度å�¯èƒ½ä¼šæ¯”其他批次的短。 (由 Raymond Hettinger 在 gh-98363 中贡献。)

math¶

  • 添加了 math.sumprod() 用于计算乘积之和。 (由 Raymond Hettinger 在 gh-100485 中贡献。)

  • 扩展 math.nextafter() 使其包å�«ä¸€ä¸ª steps å�‚数,用于一次性å�‘上或å�‘下移动多个步骤。 (由 Matthias Goergensã€�Mark Dickinson å’Œ Raymond Hettinger 在 gh-94906 中贡献。)

os¶

  • 增加了 os.PIDFD_NONBLOCK 以在é�žé˜»å¡žæ¨¡å¼�下打开具有 os.pidfd_open() 的进程的文件æ��述符。 (由 Kumar Aditya 在 gh-93312 中贡献。)

  • os.DirEntry 现在包括一个 os.DirEntry.is_junction() 方法æ�¥æ£€æŸ¥è¯¥æ�¡ç›®æ˜¯å�¦ä¸ºç›®å½•è�”接。 (由 Charles Machalow 在 gh-99547 中贡献。)

  • 在 Windows 版中添加 os.listdrives()ã€�os.listvolumes() å’Œ os.listmounts() 函数,用于枚举驱动器ã€�å�·å’ŒæŒ‚载点。 (由 Steve Dower 在 gh-102519 中贡献。)

  • os.stat() å’Œ os.lstat() 现在在 Windows 系统上更准确了。 st_birthtime 字段现在将使用文件的创建时间,st_ctime 已弃用,但ä»�包å�«åˆ›å»ºæ—¶é—´ï¼ˆä½†ä¸ºäº†ä¸Žå…¶ä»–å¹³å�°ä¿�æŒ�一致,将æ�¥å°†è¿”回最å�Žä¸€æ¬¡å…ƒæ•°æ�®æ›´æ”¹æ—¶é—´ï¼‰ã€‚ st_dev å�¯ä»¥é«˜è¾¾ 64 ä½�,st_ino å�¯ä»¥é«˜è¾¾ 128 ä½�,具体å�–决于你的文件系统,并且 st_rdev 始终设置为零,而é�žä¸�正确的值。 这两个函数在较新版本的 Windows 上将会明显更快。 (由 Steve Dower 在 gh-99726 中贡献。)

os.path¶

  • 添加 os.path.isjunction() 以检查给定路径是å�¦ä¸ºç›®å½•è�”接。 (由 Charles Machalow 在 gh-99547 中贡献。)

  • 添加 os.path.splitroot() 以将路径拆分为三元组 (drive, root, tail)。(由 Barney Gale 在 gh-101000 中贡献。)

pathlib¶

  • 增加对å­�类化 pathlib.PurePath å’Œ pathlib.Path,加上它们的 Posix å’Œ Windows 专属å�˜ä½“å½¢å¼�的支æŒ�。 å­�ç±»å�¯ä»¥é‡�è½½ pathlib.PurePath.with_segments() 方法æ�¥åœ¨è·¯å¾„实例之间传递信æ�¯ã€‚

  • 添加 pathlib.Path.walk() 用于é��历目录树并生æˆ�其中的所有文件或目录å��,类似于 os.walk()。 (由 Stanislav Zmiev 在 gh-90385 中贡献。)

  • 在 pathlib.PurePath.relative_to() 中添加了 walk_up å�¯é€‰å½¢å�‚以å…�许在结果中æ�’å…¥``..`` æ�¡ç›®ï¼›æ­¤è¡Œä¸ºä¸Ž os.path.relpath() 更为一致。(由 Domenico Ragusa 在 gh-84538 中贡献。)

  • 添加 pathlib.Path.is_junction() 作为 os.path.isjunction() 的代ç�†ã€‚ (由 Charles Machalow 在 gh-99547 中贡献。)

  • 为 pathlib.Path.glob()ã€�pathlib.Path.rglob() å’Œ pathlib.PurePath.match() 添加å�¯é€‰å½¢å�‚ case_sensitive,以匹é…�路径的大å°�写æ•�感性,从而对匹é…�过程进行更精确的控制。

pdb¶

  • 添加便利å�˜é‡�以临时ä¿�存调试会è¯�的值,并æ��供对当å‰�帧或返回值等值的快速访问。 (由高天在 gh-103693 中贡献。)

random¶

shutil¶

  • shutil.make_archive() 现在将 rootdir å�‚数传递给支æŒ�它的自定义存档程åº�。 在这ç§�情况下,它ä¸�å†�临时将进程的当å‰�工作目录更改为 rootdir æ�¥æ‰§è¡Œå­˜æ¡£ã€‚ (由 Serhiy Storchaka 在 gh-74696 中贡献。)

  • shutil.rmtree() 现在接å�—一个新的å�‚æ•° onexc,它是一个类似 onerror 的错误处ç�†å�¥æŸ„,但它接å�—一个异常实例而ä¸�是一个 (typ, val, tb) 三元组。 onerror 已被弃用。 (由 Irit Katriel 在 gh-102828 中贡献。)

  • shutil.which() 现在å�³ä½¿ç»™å®šçš„ cmd 包å�«ç›®å½•组件,在 Windows 系统上也会å�‚考 PATHEXT 环境å�˜é‡�在 PATH 中查找匹é…�项。 (由 Charles Machalow 在 gh-103179 中贡献。)

    shutil.which() 将在 Windows 上查询�执行文件时调用 NeedCurrentDirectoryForExePathW,以确定是�应将当�工作目录预先设置为�索路径。 (由 Charles Machalow 在 gh-103179 中贡献。)

    在 Windows 上 shutil.which() 将在�索路径的其他地方直接匹�之�返回 cmd 与�自 PATHEXT 的组件相匹�的路径。 (由 Charles Machalow 在 gh-103179 中贡献。)

sqlite3¶

statistics¶

  • 扩展 statistics.correlation() 以 ranked 方法的形å¼�包括对分级数æ�®çš„æ–¯çš®å°”曼相关性计算。 (由 Raymond Hettinger 在 gh-95861 中贡献。)

sys¶

  • 添加了 sys.monitoring 命å��空间以公开新的 PEP 669 监控 API。 (由 Mark Shannon 在 gh-103082 中贡献。)

  • 增加了 sys.activate_stack_trampoline() å’Œ sys.deactivate_stack_trampoline() 用于激活和å�œç”¨æ ˆæ€§èƒ½åˆ†æž�器 trampoline,以å�Š sys.is_stack_trampoline_active() 用于查询栈性能分æž�器 trampoline 是å�¦æ¿€æ´»ã€‚ (基于 Gregory P. Smith [Google] å’Œ Mark Shannon 的贡献由 Pablo Galindo å’Œ Christian Heimes 在 gh-96123 中贡献。)

  • 增加了 sys.last_exc 用于ä¿�存最新引å�‘的未处ç�†å¼‚常(针对事å�Žè°ƒè¯•的应用场景)。 弃用了以三个字段æ�¥ä¿�存相å�Œä¿¡æ�¯çš„æ—§å½¢å¼�: sys.last_type, sys.last_value å’Œ sys.last_traceback。 (由 Irit Katriel 在 gh-102778 中贡献。)

  • 现在 sys._current_exceptions() 将返回从线程 ID 到异常实例的映射,而ä¸�是到 (typ, exc, tb) 元组的映射。 (由 Irit Katriel 在 gh-103176 中贡献。)

  • sys.setrecursionlimit() å’Œ sys.getrecursionlimit()。 递归é™�制现在å�ªåº”用于 Python 代ç �。 内置函数ä¸�使用该递归é™�制,但å�—到å�¦ä¸€ç§�å�¯é˜²æ­¢é€’归导致虚拟机崩溃的机制ä¿�护。

tempfile¶

  • tempfile.NamedTemporaryFile 函数增加了一个新的å�¯é€‰å½¢å�‚ delete_on_close。 (由 Evgeny Zorin 在 gh-58451 中贡献。)

  • tempfile.mkdtemp() 现在将总是返回一个ç»�对路径,å�³ä½¿æ��供给 dir å½¢å�‚çš„å�‚数是一个相对路径。

threading¶

  • 增加了 threading.settrace_all_threads() å’Œ threading.setprofile_all_threads() 以å…�许在所è¿�行的全部线程中设置追踪和性能分æž�函数而ä¸�是å�ªåœ¨è°ƒç”¨æ–¹çº¿ç¨‹ä¸­ã€‚ (由 Pablo Galindo 在 gh-93503 中贡献。)

tkinter¶

  • 现在 tkinter.Canvas.coords() 会展平其å�‚数。 它现在ä¸�仅接å�—å�•独å�‚æ•°å½¢å¼�çš„å��æ ‡ (x1, y1, x2, y2, ...) 以å�Šç”±å��标组æˆ�çš„åº�列 ([x1, y1, x2, y2, ...]),也接å�—æˆ�对分组 ((x1, y1), (x2, y2), ... å’Œ [(x1, y1), (x2, y2), ...]) å½¢å¼�çš„å��标,就åƒ� create_*() 方法一样。 (由 Serhiy Storchaka 在 gh-94473 中贡献。)

tokenize¶

  • tokenize 模å�—包括了 PEP 701 所引入的更改。 (由 Marta Gómez Macías å’Œ Pablo Galindo 在 gh-102856 中贡献。) 请å�‚阅 ç§»æ¤�到 Python 3.12 了解有关对 tokenize 模å�—的更改详情。

types¶

typing¶

  • 针对 è¿�行时å�¯æ£€æµ‹å��è®® çš„ isinstance() 检测现在会使用 inspect.getattr_static() 而ä¸�是 hasattr() æ�¥æŸ¥æ‰¾å±žæ€§æ˜¯å�¦å­˜åœ¨ã€‚ è¿™æ„�味ç�€æ��述器和 __getattr__() 方法在针对è¿�行时å�¯æ£€æµ‹å��议的 isinstance() 检测期间ä¸�会被æ„�外地求值。 但是,这也æ„�味ç�€æŸ�些原æ�¥è¢«è§†ä¸ºè¿�行时å�¯æ£€æµ‹å��议的实例的对象在 Python 3.12+ 上将ä¸�å†�被视为è¿�行时å�¯æ£€æµ‹å��议的实例,å��之亦然。 大部分用户都ä¸�太å�¯èƒ½å�—到这一改å�˜çš„å½±å“�。 (由 Alex Waygood 在 gh-102433 中贡献。)

  • 现在è¿�行时å�¯æ£€æµ‹å��议的æˆ�员在è¿�行时一旦创建了相应的类就将被视为“已冻结â€�。 作用于è¿�行时å�¯æ£€æµ‹å��议的猴å­�è¡¥ä¸�属性将ä»�ç„¶å�¯ç”¨ï¼Œä½†ä¸�会å†�å½±å“�将对象与å��议进行比较的 isinstance() 检测中。 例如:

    >>> from typing import Protocol, runtime_checkable
    >>> @runtime_checkable
    ... class HasX(Protocol):
    ...     x = 1
    ...
    >>> class Foo: ...
    ...
    >>> f = Foo()
    >>> isinstance(f, HasX)
    False
    >>> f.x = 1
    >>> isinstance(f, HasX)
    True
    >>> HasX.y = 2
    >>> isinstance(f, HasX)  # unchanged, even though HasX now also has a "y" attribute
    True
    

    应用这项改�是为了�高针对�行时�检测�议的 isinstance() 检测速度。

  • 针对 è¿�行时å�¯æ£€æµ‹å��è®® çš„ isinstance() 检测的性能表现有显著的改进。 对于具有少é‡�æˆ�员的å��议的 isinstance() 检测相比 3.11 应当至少有 2x çš„æ��速,有些å�¯èƒ½ä¼šæœ‰ 20x 或更多的æ��速。 但是,对于具有å��四个或更多æˆ�员的å��议的 isinstance() 检测å�¯èƒ½ä¼šæ…¢äºŽ Python 3.11。 (由 Alex Waygood 在 gh-74690 å’Œ gh-103193 中贡献。)

  • 现在所有 typing.TypedDict å’Œ typing.NamedTuple 类都具有 __orig_bases__ 属性。 (由 Adrian Garcia Badaracco 在 gh-103699 中贡献。)

  • å�‘ typing.dataclass_transform() 添加了 frozen_default å½¢å�‚。 (由 Erik De Bonte 在 gh-99957 中贡献。)

unicodedata¶

  • Unicode æ•°æ�®åº“已更新到 15.0.0 版。 (由 Benjamin Peterson 在 gh-96734 中贡献。)

unittest¶

增加了 --durations 命令行选项,显示 N 个最慢的测试用例:

python3 -m unittest --durations=3 lib.tests.test_threading
.....
Slowest test durations
----------------------------------------------------------------------
1.210s     test_timeout (Lib.test.test_threading.BarrierTests)
1.003s     test_default_timeout (Lib.test.test_threading.BarrierTests)
0.518s     test_timeout (Lib.test.test_threading.EventTests)

(0.000 durations hidden.  Use -v to show these durations.)
----------------------------------------------------------------------
Ran 158 tests in 9.869s

OK (skipped=3)

(由 Giampaolo Rodola 在 gh-48330 中贡献。)

uuid¶

性能优化¶

  • 从 Unicode 对象中移除了 wstr å’Œ wstr_length æˆ�员。 这使得对象大å°�在 64 ä½�å¹³å�°ä¸Šå‡�少了 8 个或 16 个字节。 (PEP 623) (由 Inada Naoki 在 gh-92536 中贡献。)

  • 增加了在构建进程中使用 BOLT 二进制优化器的实验性支æŒ�,这将使得性能æ��å�‡ 1-5%。 (由 Kevin Modzelewski 在 gh-90536 中贡献并由 Donghee Na 在 gh-101525 中微调。 )

  • 对于包å�«åˆ†ç»„引用的替æ�¢å­—符串的正则表达å¼�替æ�¢ï¼ˆåŒ…括 re.sub() å’Œ re.subn() 函数å�Šå¯¹åº”çš„ re.Pattern 方法)å�¯åŠ é€Ÿ 2--3 å€�。 (由 Serhiy Storchaka 在 gh-91524 中贡献。)

  • 通过推迟高消耗的字符串格å¼�化æ�¥åŠ é€Ÿ asyncio.Task 的创建的。 (由 Itamar Oren 在 gh-103793 中贡献。)

  • 作为在 tokenize 模å�—中应用 PEP 701 所è¦�求的更改的附带效果,tokenize.tokenize() å’Œ tokenize.generate_tokens() 函数å�¯åŠ é€Ÿè‡³å¤š 64%。 (由 Marta Gómez Macías å’Œ Pablo Galindo 在 gh-102856 中贡献。)

  • 通过新的 LOAD_SUPER_ATTR 指令加速 super() 方法调用和属性加载。 (由 Carl Meyer å’Œ Vladimir Matveev 在 gh-103497 中贡献。)

CPython 字节�的改�¶

  • 移除了 LOAD_METHOD 指令。 它已被å�ˆå¹¶è‡³ LOAD_ATTR。 现在如果设置了 LOAD_ATTR çš„ oparg 比特ä½�则它的行为将类似原æ�¥çš„ LOAD_METHOD。 (由 Ken Jin 在 gh-93429 中贡献。)

  • 移除了 JUMP_IF_FALSE_OR_POP å’Œ JUMP_IF_TRUE_OR_POP 指令。 (由 Irit Katriel 在 gh-102859 中贡献。)

  • 移除了 PRECALL 指令。 (由 Mark Shannon 在 gh-92925 中贡献。)

  • 添加了 BINARY_SLICE å’Œ STORE_SLICE 指令。 (由 Mark Shannon 在 gh-94163 中贡献。)

  • 添加了 CALL_INTRINSIC_1 指令。 (由 Mark Shannon 在 gh-99005 中贡献。)

  • 添加了 CALL_INTRINSIC_2 指令。 (由 Irit Katriel 在 gh-101799 中贡献。)

  • 添加了 CLEANUP_THROW 指令。 (由 Brandt Bucher 在 gh-90997 中贡献。)

  • 添加了 END_SEND 指令。 (由 Mark Shannon 在 gh-103082 中贡献。)

  • 增加了 LOAD_FAST_AND_CLEAR 指令作为 PEP 709 的实现的组æˆ�部分。 (由 Carl Meyer 在 gh-101441 中贡献。)

  • 添加了 LOAD_FAST_CHECK 指令。 (由 Dennis Sweeney 在 gh-93143 中贡献。)

  • 增加了 LOAD_FROM_DICT_OR_DEREF, LOAD_FROM_DICT_OR_GLOBALS å’Œ LOAD_LOCALS æ“�作ç �作为 PEP 695 的组æˆ�部分。 移除了 LOAD_CLASSDEREF æ“�作ç �,它å�¯ä»¥ç”¨ LOAD_LOCALS 加 LOAD_FROM_DICT_OR_DEREF æ�¥ä»£æ›¿ã€‚ (由 Jelle Zijlstra 在 gh-103764 中贡献。)

  • 增加了 LOAD_SUPER_ATTR 指令。 (由 Carl Meyer å’Œ Vladimir Matveev 在 gh-103497 中贡献。)

  • 添加了 RETURN_CONST 指令。 (由 Wenyang Wang 在 gh-101632 中贡献。)

演示和工具¶

  • 移除了包å�«æ—§æ¼”示脚本的 Tools/demo/ 目录。 其副本å�¯åœ¨ old-demos project 中找到。 (由 Victor Stinner 在 gh-97681 中贡献。)

  • 移除了 Tools/scripts/ 目录下过时的示例脚本。 其副本å�¯åœ¨ old-demos project 中找到。 (由 Victor Stinner 在 gh-97669 中贡献。)

弃用¶

  • argparse: argparse.BooleanOptionalAction çš„ type, choices å’Œ metavar å½¢å�‚已被弃用并将在 3.14 中移除。 (由 Nikita Sobolev 在 gh-92248 中贡献。)

  • ast: 以下 ast 特性自 Python 3.8 起已在文档中声明弃用,现在当è¿�行时如果它们被访问或使用将å�‘出 DeprecationWarning,并将在 Python 3.14 中移除:

    • ast.Num

    • ast.Str

    • ast.Bytes

    • ast.NameConstant

    • ast.Ellipsis

    请改用 ast.Constant。 (由 Serhiy Storchaka 在 gh-90953 中贡献。)

  • asyncio:

  • calendar: calendar.January å’Œ calendar.February 常é‡�已被弃用并由 calendar.JANUARY å’Œ calendar.FEBRUARY 替代。 (由 Prince Roshan 在 gh-103636 中贡献。)

  • collections.abc: 已弃用 collections.abc.ByteString。 推è��改用 Sequence 或 collections.abc.Buffer。 在类型标中,推è��改用并集,如 bytes | bytearray 或 collections.abc.Buffer。 (由 Shantanu Jain 在 gh-91896 中贡献。)

  • datetime: datetime.datetime çš„ utcnow() å’Œ utcfromtimestamp() 已被弃用并将在未æ�¥çš„版本中移除。 请改用å�¯æ„ŸçŸ¥æ—¶åŒºçš„对象以 UTC æ�¥è¡¨ç¤ºæ—¥æœŸæ—¶é—´ï¼šåˆ†åˆ«è°ƒç”¨ now() å’Œ fromtimestamp() 并设置 tz å½¢å�‚为 datetime.UTC。 (由 Paul Ganssle 在 gh-103857 中贡献。)

  • email: 已弃用 email.utils.localtime() 中的 isdst å½¢å�‚。 (由 Alan Williams 在 gh-72346 中贡献。)

  • importlib.abc: 已弃用下列类,计划在 Python 3.14 中移除:

    • importlib.abc.ResourceReader

    • importlib.abc.Traversable

    • importlib.abc.TraversableResources

    使用 importlib.resources.abc 类代替:

    (由 Jason R. Coombs 和 Hugo van Kemenade 在 gh-93963 中贡献。)

  • itertools: 已弃用对 copyã€�deepcopy å’Œ pickle æ“�作的支æŒ�,它们未被写入文档ã€�效率低下ã€�历å�²ä¸Šå……满问题且缺ä¹�一致性。 这将在 3.14 中移除以显著å‡�少代ç �é‡�和维护负担。 (由 Raymond Hettinger 在 gh-101588 中贡献。)

  • multiprocessing: 在 Python 3.14 中,默认的 multiprocessing å�¯åŠ¨æ–¹æ³•å°†åœ¨ Linuxã€�BSD 和其他é�ž macOS çš„ POSIX å¹³å�°ä¸Šæ”¹ä¸ºæ›´å®‰å…¨çš„æ–¹æ³•,在这些平å�°ä¸Šç›®å‰�默认为 'fork' (gh-84559)。 在è¿�行时添加相关警告被认为干扰性太大因为大部分代ç �都ä¸�会在æ„�这个问题。 当你的代ç � 需è¦� 'fork' 时请使用 get_context() 或 set_start_method() API 显å¼�地指明。 å�‚è§� 上下文和å�¯åŠ¨æ–¹æ³•ã€‚

  • pkgutil: pkgutil.find_loader() å’Œ pkgutil.get_loader() 已被弃用并将在 Python 3.14 中移除;请改用 importlib.util.find_spec()。 (由 Nikita Sobolev 在 gh-97850 中贡献。)

  • pty: 该模å�—有两个未写入文档的 master_open() å’Œ slave_open() 函数自 Python 2 èµ·å�³å·²è¢«å¼ƒç”¨ä½†ç›´åˆ° 3.12 æ‰�添加了相应的 DeprecationWarning。 它们将在 3.14 中移除。 (由 Soumendra Ganguly å’Œ Gregory P. Smith 在 gh-85984 中贡献。).)

  • os:

    • 在 Windows 上由 os.stat() å’Œ os.lstat() 返回的 st_ctime 字段已被弃用。 在未æ�¥çš„å�‘布版中,它们将包å�«æœ€è¿‘的元数æ�®ä¿®æ”¹æ—¶é—´ï¼Œä»¥ä¸Žå…¶ä»–å¹³å�°ä¿�æŒ�一致。 ç›®å‰�,它们ä»�然包å�«åˆ›å»ºæ—¶é—´ï¼Œè¯¥å€¼ä¹Ÿå�¯é€šè¿‡æ–°çš„ st_birthtime 字段获å�–。 (由 Steve Dower 在 gh-99726 中贡献。)

    • 在 POSIX å¹³å�°ä¸Šï¼Œå½“ os.fork() 检测到被多线程的进程调用时现在会引å�‘ DeprecationWarning。当在 POSIX å¹³å�°ä¸Šè¿™æ ·å�šæ—¶å§‹ç»ˆä¼šå­˜åœ¨åŠŸèƒ½ä¸Šçš„ä¸�兼容性。 å�³ä½¿è¿™æ ·çš„代ç � 看起æ�¥ 有效。 我们添加该警告是为了引起人们的注æ„�因为这样å�šé�‡åˆ°çš„问题å�˜å¾—è¶Šæ�¥è¶Šå¤šã€‚ 请å�‚阅 os.fork() 文档了解详情并查看 关于 fork 与线程ä¸�兼容问题的讨论 以了解 为什么 我们现在è¦�å�‘å¼€å�‘者公开这一长期存在的平å�°å…¼å®¹æ€§é—®é¢˜ã€‚

    当由于使用 multiprocessing 或 concurrent.futures 而出现此警告时的解决办法是使用其他的 multiprocessing �动方法如 "spawn" 或 "forkserver"。

  • shutil: shutil.rmtree() çš„ onerror å�‚数已被弃用;请改用 onexc。 (由 Irit Katriel 在 gh-102828 中贡献。)

  • sqlite3:

  • sys: sys.last_type, sys.last_value å’Œ sys.last_traceback 字段已被弃用。 请改用 sys.last_exc。 (由 Irit Katriel 在 gh-102778 中贡献。)

  • tarfile: æ��å�– tar 归档而ä¸�指定 filter çš„å�šæ³•å·²è¢«å¼ƒç”¨ç›´åˆ° Python 3.14,在该版本中 'data' å°†æˆ�为默认过滤器。 请å�‚阅 解压缩过滤器 了解详情。

  • typing:

  • xml.etree.ElementTree: 现在该模å�—在对 xml.etree.ElementTree.Element 执行真值测试时将å�‘出 DeprecationWarning。 在之å‰�,Python 实现会å�‘出 FutureWarning,而 C 实现则ä¸�会å�‘出任何警告。 (由 Jacob Walls 在 gh-83122 中贡献。)

  • coroutine throw(), generator throw() å’Œ async generator throw() 的三å�‚æ•°ç­¾å��å½¢å¼� (type, value, traceback) 已被弃用并å�¯èƒ½åœ¨æœªæ�¥çš„ Python 版本中移除。 请改用这些函数的å�•å�‚数版本。 (由 Ofey Chan 在 gh-89874 中贡献。)

  • 现在当一个模å�—上的 __package__ ä¸�å�ŒäºŽ __spec__.parent 时将引å�‘ DeprecationWarning (在之å‰�版本中则为 ImportWarning)。 (由 Brett Cannon 在 gh-65961 中贡献。)

  • 在模å�—上设置 __package__ 或 __cached__ 已被弃用,在 Python 3.14 中导入系统将ä¸�å†�设置或考虑这些属性。 (由 Brett Cannon 在 gh-65961 中贡献。)

  • 对布尔值的ä½�å�–å��è¿�算符 (~) 已被弃用。 它在 Python 3.14 中将抛出错误。 请改用 not æ�¥æ‰§è¡Œå¸ƒå°”值的逻辑é�žè¿�算。 在你确实需è¦�对下层的 int 执行按ä½�å�–å��è¿�算的少数场景下,请显å¼�地将其转æ�¢ä¸ºæ•´æ•°å€¼: ~int(x)。 (由 Tim Hoffmann 在 gh-103487 中贡献。)

  • 在代ç �对象上对 co_lnotab 的访问自 Python 3.10 起已通过 PEP 626 被弃用,但直到 3.12 æ‰�添加了适当的 DeprecationWarning,因而它将在 3.14 中被移除。 (由 Nikita Sobolev 在 gh-101866 中贡献。)

计划在 Python 3.13 中移除¶

以下模�和 API 已在之�的 Python �布版中弃用,并将在 Python 3.13 中移除。

模� (�� PEP 594):

其他模�:

  • lib2to3,以å�Š 2to3 程åº� (gh-84540)

API:

计划在 Python 3.14 中移除¶

以下 API 已被弃用并将在 Python 3.14 中移除。

  • argparse: argparse.BooleanOptionalAction çš„ type, choices å’Œ metavar å½¢å�‚

  • ast:

    • ast.Num

    • ast.Str

    • ast.Bytes

    • ast.NameConstant

    • ast.Ellipsis

  • asyncio:

    • asyncio.MultiLoopChildWatcher

    • asyncio.FastChildWatcher

    • asyncio.AbstractChildWatcher

    • asyncio.SafeChildWatcher

    • asyncio.set_child_watcher()

    • asyncio.get_child_watcher(),

    • asyncio.AbstractEventLoopPolicy.set_child_watcher()

    • asyncio.AbstractEventLoopPolicy.get_child_watcher()

  • collections.abc: collections.abc.ByteString。

  • email: email.utils.localtime() 中的 isdst å½¢å�‚。

  • importlib.abc:

    • importlib.abc.ResourceReader

    • importlib.abc.Traversable

    • importlib.abc.TraversableResources

  • itertools: 对 copy, deepcopy å’Œ pickle æ“�作的支æŒ�。

  • pkgutil:

    • pkgutil.find_loader()

    • pkgutil.get_loader()。

  • pty:

    • pty.master_open()

    • pty.slave_open()

  • shutil: shutil.rmtree() çš„ onerror å�‚æ•°

  • typing: typing.ByteString

  • xml.etree.ElementTree: 对 xml.etree.ElementTree.Element 的真值测试。

  • 模å�—对象上的 __package__ å’Œ __cached__ 属性。

  • 代ç �对象的 co_lnotab 属性。

Python 3.15 中的待移除功能¶

以下 API 已被弃用并将在 Python 3.15 中移除。

API:

计划在未�版本中移除¶

下列 API 在更早的 Python 版本中已被弃用并将被移除,但目�还没有确定它们的移除日期。

  • array çš„ 'u' æ ¼å¼�代ç � (gh-57281)

  • typing.Text (gh-92332)

  • ç›®å‰� Python 接å�—数字类字é�¢å€¼å�Žé�¢ç´§è·Ÿå…³é”®å­—的写法,例如 0in x, 1or x, 0if 1else 2。 它将å…�许åƒ� [0x1for x in y] 这样令人困惑且模棱两å�¯çš„表达å¼� (它å�¯ä»¥è¢«è§£è¯»ä¸º [0x1 for x in y] 或者 [0x1f or x in y])。 从本å�‘布版开始,如果数字类字é�¢å€¼å�Žé�¢ç´§è·Ÿå…³é”®å­— and, else, for, if, in, is å’Œ or 中的一个将会引å�‘弃用警告。 在未æ�¥çš„版本中它将改为语法警告,最终将改为语法错误。 (gh-87999)

移除¶

asynchat 和 asyncore¶

  • 这两个模å�—已根æ�® PEP 594 中的时间表被移除,它们从 Python 3.6 起已被弃用。 请改用 asyncio。 (由 Nikita Sobolev 在 gh-96580 中贡献。)

configparser¶

  • configparser 中的几个从 3.2 起已被弃用的å��称已根æ�® gh-89336 被移除:

    • configparser.ParsingError ä¸�å†�具有 filename 属性或å�‚数。 请改用 source 属性和å�‚数。

    • configparser ä¸�å†�具有 SafeConfigParser 类。 请改用更简短的å��ç§° ConfigParser。

    • configparser.ConfigParser ä¸�å†�具有 readfp 方法。 请改用 read_file()。

distutils¶

  • 移除了 distutils 包。 它已在 Python 3.10 中根æ�® PEP 632 "Deprecate distutils module" 被弃用。 对于ä»�然使用 distutils 且无法å�‡çº§ä¸ºä½¿ç”¨å…¶ä»–工具的项目,å�¯ä»¥å®‰è£… setuptools 项目:它ä»�ç„¶æ��供了 distutils。 (由 Victor Stinner 在 gh-92584 中贡献。)

ensurepip¶

  • 从 ensurepip 中移除了æ�†ç»‘çš„ setuptools wheel,并å�œæ­¢åœ¨ç”± venv 创建的环境中安装 setuptools。

    pip (>= 22.1) ���求在环境中安装 setuptools。 基于 setuptools (和基于 distutils) 的包�然�通过 pip install �使用,因为 pip 将在它用于构建包的构建环境中�供 setuptools。

    在默认情况下由 venv 创建或通过 ensurepip �始化的环境将���供 easy_install, pkg_resources, setuptools 和 distutils 包,因为它们是 setuptools 包的组�部分。 对于在�行时�赖这些包的项目,应当将 setuptools 项目声明为�赖项之一并�独安装(通常是使用 pip)。

    (由 Pradyun Gedam 在 gh-95299 中贡献。)

enum¶

  • 移除了 enum çš„ EnumMeta.__getattr__,枚举属性访问已ä¸�å†�需è¦�它。 (由 Ethan Furman 在 gh-95083 中贡献。)

ftplib¶

  • 移除了 ftplib çš„ FTP_TLS.ssl_version 类属性:请改用 context å½¢å�‚。 (由 Victor Stinner 在 gh-94172 中贡献。)

gzip¶

  • 移除了 gzip 中 gzip.GzipFile çš„ filename 属性,自 Python 2.6 起该属性已被弃用,请改用 name 属性。 在å�¯å†™æ¨¡å¼�下,如果 filename 属性没有 '.gz' 文件扩展å��则会添加它。 (由 Victor Stinner 在 gh-94196 中贡献。)

hashlib¶

  • 移除了 hashlib 中 hashlib.pbkdf2_hmac() 的纯 Python 实现,它在 Python 3.10 中已被弃用。 Python 3.10 å�Šæ›´æ–°ç‰ˆæœ¬éœ€è¦� OpenSSL 1.1.1 (PEP 644):该 OpenSSL 版本æ��供了 pbkdf2_hmac() 的更快速的 C 实现。 (由 Victor Stinner 在 gh-94199 中贡献。)

importlib¶

  • importlib 中许多先å‰�已弃用对象的清ç�†å·¥ä½œçŽ°å·²å®Œæˆ�:

    • 对 module_repr() 的引用和支æŒ�已被移除。 (由 Barry Warsaw 在 gh-97850 中贡献。)

    • importlib.util.set_package, importlib.util.set_loader å’Œ importlib.util.module_for_loader å�‡å·²è¢«ç§»é™¤ã€‚ (由 Brett Cannon å’Œ Nikita Sobolev 在 gh-65961 å’Œ gh-97850 中贡献。)

    • 对 find_loader() å’Œ find_module() API 的支æŒ�已被移除。 (由 Barry Warsaw 在 gh-98040 中贡献。)

    • importlib.abc.Finder, pkgutil.ImpImporter å’Œ pkgutil.ImpLoader 已被移除。 (由 Barry Warsaw 在 gh-98040 中贡献。)

imp¶

  • imp 模å�—已被移除。 (由 Barry Warsaw 在 gh-98040 中贡献。)

    �进行�移,请�考以下对照表:

    imp

    importlib

    imp.NullImporter

    将 None �入到 sys.path_importer_cache

    imp.cache_from_source()

    importlib.util.cache_from_source()

    imp.find_module()

    importlib.util.find_spec()

    imp.get_magic()

    importlib.util.MAGIC_NUMBER

    imp.get_suffixes()

    importlib.machinery.SOURCE_SUFFIXES, importlib.machinery.EXTENSION_SUFFIXES 和 importlib.machinery.BYTECODE_SUFFIXES

    imp.get_tag()

    sys.implementation.cache_tag

    imp.load_module()

    importlib.import_module()

    imp.new_module(name)

    types.ModuleType(name)

    imp.reload()

    importlib.reload()

    imp.source_from_cache()

    importlib.util.source_from_cache()

    imp.load_source()

    �下文

    将 imp.load_source() 替�为:

    import importlib.util
    import importlib.machinery
    
    def load_source(modname, filename):
        loader = importlib.machinery.SourceFileLoader(modname, filename)
        spec = importlib.util.spec_from_file_location(modname, filename, loader=loader)
        module = importlib.util.module_from_spec(spec)
        # The module is always executed and not cached in sys.modules.
        # Uncomment the following line to cache the module.
        # sys.modules[module.__name__] = module
        loader.exec_module(module)
        return module
    
  • 已移除 imp 的函数和属性并且没有替代选项:

    • 未写入文档的函数:

      • imp.init_builtin()

      • imp.load_compiled()

      • imp.load_dynamic()

      • imp.load_package()

    • imp.lock_held(),``imp.acquire_lock()``,``imp.release_lock()``: 加é”�方案在 Python 3.3 中已改为模å�—级é”�。

    • imp.find_module() 常é‡�: SEARCH_ERROR, PY_SOURCE, PY_COMPILED, C_EXTENSION, PY_RESOURCE, PKG_DIRECTORY, C_BUILTIN, PY_FROZEN, PY_CODERESOURCE, IMP_HOOK。

io¶

  • 移除了 io 中的 io.OpenWrapper å’Œ _pyio.OpenWrapper,它们在 Python 3.10 中已被弃用:请改用 open()。 open() (io.open()) 函数是一个内置函数。 自 Python 3.10 起,_pyio.open() 也是一个é�™æ€�方法。 (由 Victor Stinner 在 gh-94169 中贡献。).)

locale¶

  • 移除了 locale çš„ locale.format() 函数,它在 Python 3.7 中已被弃用:请改用 locale.format_string()。 (由 Victor Stinner 在 gh-94226 中贡献。)

smtpd¶

  • smtpd 模å�—已按照 PEP 594 中的计划表被移除,它在 Python 3.4.7 å’Œ 3.5.4 中已被弃用。 请改用 aiosmtpd PyPI 模å�—或任何其他基于 asyncio çš„æœ�务器程åº�。 (由 Oleg Iarygin 在 gh-93243 中贡献。)

sqlite3¶

  • 以下未写入文档的 sqlite3 特性,在 Python 3.10 中已被弃用,现在已被移除:

    • sqlite3.enable_shared_cache()

    • sqlite3.OptimizedUnicode

    如果必须使用共享缓存,请在以 URI 模�打开数�库时使用 cache=shared 查询�数。

    sqlite3.OptimizedUnicode 文本工厂函数自 Python 3.3 起已�为 str 的一个别�。 之�将文本工厂设为 OptimizedUnicode 的代��以显�地使用 str,或者�赖�样为 str 的默认值。

    (由 Erlend E. Aasland 在 gh-92548 中贡献。)

ssl¶

  • 移除了 ssl çš„ ssl.RAND_pseudo_bytes() 函数,它在 Python 3.6 中已被弃用:请改用 os.urandom() 或 ssl.RAND_bytes()。 (由 Victor Stinner 在 gh-94199 中贡献。)

  • 移除了 ssl.match_hostname() 函数。 它在 Python 3.7 中已被弃用。 OpenSSL 自 Python 3.7 起将会执行主机å��匹é…�,Python å·²ä¸�å†�使用 ssl.match_hostname() 函数。 (由 Victor Stinner 在 gh-94199 中贡献。)

  • 移除了 ssl.wrap_socket() 函数,它在 Python 3.7 中已被弃用:请改为创建一个 ssl.SSLContext 对象并调用其 ssl.SSLContext.wrap_socket 方法。 任何ä»�然使用 ssl.wrap_socket() 的包都ä¸�å†�适用并且是ä¸�安全的。 该函数既ä¸�会å�‘é€� SNI TLS 扩展也ä¸�会验è¯�æœ�务器主机å��。 其代ç �会å�—到 CWE-295: ä¸�正确的è¯�书验è¯�问题的影å“�。 (由 Victor Stinner 在 gh-94199 中贡献。)

unittest¶

webbrowser¶

  • 从 webbrowser 移除了对过时æµ�览器的支æŒ�。 被移除的æµ�览器包括:Grailã€�Mosaicã€�Netscapeã€�Galeonã€�Skipstoneã€�Iceapeã€�Firebird å’Œ Firefox 35 å�Šä»¥ä¸‹çš„版本 (gh-102871)。

xml.etree.ElementTree¶

  • 移除了纯 Python 实现的 ElementTree.Element.copy() 方法,该方法在 Python 3.10 中已被弃用,请改用 copy.copy() 函数。 xml.etree.ElementTree çš„ C 实现没有 copy() 方法,å�ªæœ‰ __copy__() 方法。 (由 Victor Stinner 在 gh-94383 中贡献。)

zipimport¶

  • 移除了 zipimport çš„ find_loader() å’Œ find_module() 方法,它们在 Python 3.10 中已被弃用:请改用 find_spec() 方法。 请å�‚阅 PEP 451 了解相关说明。 (由 Victor Stinner 在 gh-94379 中贡献。)

其他事项¶

  • 从文档 Makefile å’Œ Doc/tools/rstlint.py 中移除了 suspicious 规则,请改用 sphinx-lint。 (由 Julien Palard 在 gh-98179 中贡献。)

  • 移除了 ftplibã€�imaplibã€�poplib å’Œ smtplib 模å�—中的 keyfile å’Œ certfile å½¢å�‚数,以å�Š http.client 模å�—中的 key_fileã€�cert_file å’Œ check_hostname å½¢å�‚,它们自 Python 3.6 起都已被弃用。 请改用 context å½¢å�‚(在 imaplib 中为 ssl_context å½¢å�‚)。 (由 Victor Stinner 在 gh-94172 中贡献。).)

  • 从多个标准库模å�—和测试中移除了 Jython 兼容性处ç�†ã€‚ (由 Nikita Sobolev 在 gh-99482 中贡献。)

  • 从 ctypes 模å�—移除了 _use_broken_old_ctypes_structure_semantics_ 旗标。 (由 Nikita Sobolev 在 gh-99285 中贡献。)

移�到 Python 3.12¶

本节列出了先��述的更改以��能需�更改代�的其他错误修正.

Python API 的�化¶

  • 现在对于正则表达å¼�中的数字分组引用和分组å��称将应用更严格的规则。 现在å�ªæŽ¥å�— ASCII æ•°å­—åº�列作为数字引用。 字节串模å¼�和替æ�¢å­—符串中的分组å��称现在å�ªèƒ½åŒ…å�« ASCII å­—æ¯�ã€�数字和下划线。 (由 Serhiy Storchaka 在 gh-91760 中贡献。)

  • 移除了自 Python 3.10 起已被弃用的 randrange() 功能。 以å‰�,randrange(10.0) 会无æ�Ÿåœ°è½¬æ�¢ä¸º randrange(10)。 现在,它将引å�‘ TypeError。 此外,对于é�žæ•´æ•°å€¼å¦‚ randrange(10.5) 或 randrange('10') 所引å�‘的异常已从 ValueError 改为 TypeError。 这也防止了 randrange(1e25) 会从比 randrange(10**25) 更大的范围中é�™é»˜é€‰æ‹©çš„问题。 (最åˆ�ç”± Serhiy Storchaka 在 gh-86388 中æ��议。)

  • argparse.ArgumentParser 将从文件(例如 fromfile_prefix_chars 选项)读å�–å�‚数的编ç �æ ¼å¼�和错误处ç�†å�¥æŸ„从默认的文本编ç �æ ¼å¼�(例如 locale.getpreferredencoding(False) 调用)改为 filesystem encoding and error handler。 在 Windows 系统中å�‚数文件应使用 UTF-8 而ä¸�是 ANSI 代ç �页æ�¥ç¼–ç �。

  • 移除在 Python 3.4.7 å’Œ 3.5.4 中被弃用的 asyncore-based smtpd 模å�—。 推è��使用基于 asyncio çš„ aiosmtpd PyPI 模å�—作为替代。

  • shlex.split(): ä¼ å…¥ None 作为 s å�‚数现在将引å�‘异常,而ä¸�是读å�– sys.stdin。 该特性在 Python 3.9 中已被弃用。 (由 Victor Stinner 在 gh-94352 中贡献。)

  • os 模å�—ä¸�å†�接å�—类似字节串的路径,如 bytearray å’Œ memoryview 类型:å�ªæŽ¥å�—明确的 bytes 类型字节串。 (由 Victor Stinner 在 gh-98393 中贡献。)

  • 现在 syslog.openlog() å’Œ syslog.closelog() 如果在å­�解释器中使用将失败。 syslog.syslog() ä»�å�¯åœ¨å­�解释器中使用,但å‰�æ��是 syslog.openlog() 已在主解释器中被调用。 这些新é™�制ä¸�适用于主解释器,因此å�ªæœ‰å°‘数用户å�¯èƒ½ä¼šå�—到影å“�。 这一改å�˜æœ‰åŠ©äºŽå®žçŽ°è§£é‡Šå™¨éš”ç¦»ã€‚ 此外,syslog 是一个针对进程全局资æº�的包装器,而这些资æº�最好是由主解释器æ�¥ç®¡ç�†ã€‚ (由 Donghee Na 在 gh-99127 中贡献。)

  • 未写入文档的 cached_property() çš„é”�定行为已被移除,因为该行为会在类的所有实例中é”�定,从而导致高é”�定争用。 è¿™æ„�味ç�€å¦‚果两个线程å�Œæ—¶è¿�行,缓存属性获å�–函数现在å�¯ä»¥åœ¨å�•个实例中è¿�行ä¸�止一次。 对于大多数简å�•的缓存属性(例如那些幂等的并且å�ªéœ€æ ¹æ�®å®žä¾‹çš„其他属性计算一个值的属性)æ�¥è¯´è¿™æ˜¯æ²¡æœ‰é—®é¢˜çš„。 如果需è¦�å�Œæ­¥ï¼Œå�¯åœ¨ç¼“存属性获å�–函数中或多线程访问点周围实现é”�定æ“�作。

  • 现在 sys._current_exceptions() 将返回从线程 ID 到异常实例的映射,而ä¸�是到 (typ, exc, tb) 元组的映射。 (由 Irit Katriel 在 gh-103176 中贡献。)

  • 当使用 tarfile 或 shutil.unpack_archive() æ��å�– tar 文件时,请传入 filter å�‚æ•°æ�¥é™�制å�¯èƒ½ä»¤äººæ„Ÿåˆ°æ„�外或å�±é™©çš„特性。 请å�‚阅 解压缩过滤器 了解详情。

  • 由于在 PEP 701 中引入的更改 tokenize.tokenize() å’Œ tokenize.generate_tokens() 函数的输出现在å�‘生了改å�˜ã€‚ è¿™æ„�味ç�€ä¸�å†�为 f-字符输出 STRING è¯�元而是改为产生 PEP 701 中æ��è¿°çš„è¯�元:除了用于对表达å¼�组件进行分è¯�的适当è¯�元外现在还有 FSTRING_START, FSTRING_MIDDLE å’Œ FSTRING_END 会被用于 f-字符串的“字符串â€�部分。 例如对于 f-字符串 f"start {1+1} end" 旧版本的分è¯�器会生æˆ�:

    1,0-1,18:           STRING         'f"start {1+1} end"'
    

    而新版本将生�:

    1,0-1,2:            FSTRING_START  'f"'
    1,2-1,8:            FSTRING_MIDDLE 'start '
    1,8-1,9:            OP             '{'
    1,9-1,10:           NUMBER         '1'
    1,10-1,11:          OP             '+'
    1,11-1,12:          NUMBER         '1'
    1,12-1,13:          OP             '}'
    1,13-1,17:          FSTRING_MIDDLE ' end'
    1,17-1,18:          FSTRING_END    '"'
    

    此外,支� PEP 701 所需的改�还�能会导致一些细微的行为改�。 这些�化包括:

    • 在对一些无效 Python 字符如 ! 进行分è¯�时相应è¯�元的 type 属性已从 ERRORTOKEN å�˜ä¸º OP。

    • ä¸�完整的å�•行字符串现在也会åƒ�ä¸�完整的多行字符串一样引å�‘ tokenize.TokenError。

    • æŸ�些ä¸�完整或无效的 Python 代ç �现在会引å�‘ tokenize.TokenError 而ä¸�是在执行分è¯�时返回任æ„�çš„ ERRORTOKEN è¯�元。

    • 在å�Œä¸€æ–‡ä»¶ä¸­æ··å�ˆä½¿ç”¨åˆ¶è¡¨ç¬¦å’Œç©ºæ ¼ä½œä¸ºç¼©è¿›ä¸�å†�å�—到支æŒ�而是会引å�‘ TabError。

  • 现在 threading 模å�—会预期 _thread 模å�—具有 _is_main_interpreter 属性。 它是一个ä¸�带å�‚数的函数并会在当å‰�解释器为主解释器时返回 True。

    任何�供了自定义 _thread 模�的库或应用程�都应当�供 _is_main_interpreter()。 (�� gh-112826。)

构建�化¶

  • Python ä¸�å†�使用 setup.py æ�¥æž„建共享的 C 扩展模å�—。 头文件和库等编译å�‚数在 configure 脚本中检测。 扩展将由 Makefile æ�¥æž„建。 大多数扩展使用 pkg-config 并回退为手动检测。 (由 Christian Heimes 在 gh-93939 中贡献。)

  • 现在需è¦�用带有两个形å�‚çš„ va_start(),如 va_start(args, format), æ�¥æž„建 Python。 现在将ä¸�会å†�调用å�•个形å�‚çš„ va_start()。 (由 Kumar Aditya 在 gh-93207 中贡献。)

  • 现在如果 Clang 编译器接å�— ThinLTO 选项则 CPython 会将其作为默认的链接时间优化策略。 (由 Donghee Na 在 gh-89536 中贡献。)

  • 在 Makefile 中添加了 COMPILEALL_OPTS å�˜é‡�以覆盖 make install 中的 compileall 选项 (默认值: -j0)。 å¹¶å°† 3 æ�¡ compileall 命令å�ˆå¹¶ä¸ºå�•æ�¡å‘½ä»¤ä»¥ä¾¿ä¸€æ¬¡æ€§æž„建所有优化级别 (0, 1, 2) çš„ .pyc 文件。 (由 Victor Stinner 在 gh-99289 中贡献。)

  • 为 64 ä½� LoongArch 添加了平å�°ä¸‰é€‰é¡¹:

    • loongarch64-linux-gnusf

    • loongarch64-linux-gnuf32

    • loongarch64-linux-gnu

    (由 Zhang Na 在 gh-90656 中贡献。).)

  • PYTHON_FOR_REGEN 现在需è¦� Python 3.10 或更新版本。

  • 现在需è¦�有 autoconf 2.71 å’Œ aclocal 1.16.4 æ‰�能é‡�新生æˆ� !configure。 (由 Christian Heimes 在 gh-89886 中贡献。)

  • æ�¥è‡ª python.org çš„ Windows 版本和 macOS 安装程åº�现在使用 OpenSSL 3.0。

C API 的�化¶

新的特性¶

  • PEP 697: 引入了 ä¸�稳定 C API 层,用于调试器和 JIT 编译器等低层级工具。 该 API å�¯èƒ½ä¼šåœ¨ CPython çš„æ¯�个次è¦�版本中å�‘生å�˜åŒ–而但å�‘出弃用警告。 其内容在å��称中以 PyUnstable_ å‰�缀标记。

    代�对象构造器:

    • PyUnstable_Code_New() (ç”± PyCode_New 改å��而æ�¥)

    • PyUnstable_Code_NewWithPosOnlyArgs() (ç”± PyCode_NewWithPosOnlyArgs 改å��而æ�¥)

    代�对象的�外存储 (PEP 523):

    • PyUnstable_Eval_RequestCodeExtraIndex() (ç”± _PyEval_RequestCodeExtraIndex 改å��而æ�¥)

    • PyUnstable_Code_GetExtra() (ç”± _PyCode_GetExtra 改å��而æ�¥)

    • PyUnstable_Code_SetExtra() (ç”± _PyCode_SetExtra 改å��而æ�¥)

    原有�称将继续�用直到对应的 API �生改�。

    (由 Petr Viktorin 在 gh-101101 中贡献。)

  • PEP 697: 添加了用于扩展实例内存布局ä¸�é€�明的类型的 API:

    (由 Petr Viktorin 在 gh-103509 中贡献。)

  • 添加了新的 å�—é™� C API 函数 PyType_FromMetaclass(),它使用了é¢�外的 metaclass å�‚数对现有的 PyType_FromModuleAndSpec() 进行了泛化。 (由 Wenzel Jakob 在 gh-93012 中贡献。)

  • 在 å�—é™� 中添加了用于创建å�¯ä½¿ç”¨ vectorcall å��è®® æ�¥è°ƒç”¨çš„对象的 API:

    现在当一个类的 __call__() 方法被�新赋值时,该类的 Py_TPFLAGS_HAVE_VECTORCALL 旗标将被移除。 这使得 vectorcall �以安全地用于��类型(�没有���旗标 Py_TPFLAGS_IMMUTABLETYPE 的堆类型)。 未�载 tp_call 的��类型现在继承了 Py_TPFLAGS_HAVE_VECTORCALL 旗标。 (由 Petr Viktorin 在 gh-93274 中贡献。)

    新增了 Py_TPFLAGS_MANAGED_DICT 和 Py_TPFLAGS_MANAGED_WEAKREF 旗标。 这将�许扩展类在支�对象 __dict__ 和弱引用时�少记录消耗,�用更少内存并并加快访问速度。

  • 在 å�—é™� API 中添加了使用 vectorcall å��è®® 执行调用的 API:

    这�味� vectorcall 调用�议的传入端和传出端现在都�以在 �� API 中使用。 (由 Wenzel Jakob 在 gh-98586 中贡献。)

  • 添加了两个新的公共函数 PyEval_SetProfileAllThreads() å’Œ PyEval_SetTraceAllThreads(),å…�许在调用的å�Œæ—¶åœ¨æ‰€æœ‰è¿�行线程中设置追踪和性能分æž�函数。 (由 Pablo Galindo 在 gh-93503 中贡献。)

  • 为 C API 添加了新函数 PyFunction_SetVectorcall() 用于设置给定 PyFunctionObject çš„ vectorcall 字段。 (由 Andrew Frost 在 gh-92257 中贡献。)

  • C API 现在å…�许通过 PyDict_AddWatcher()ã€�PyDict_Watch() 和相关 API 注册回调,以便在字典被修改时调用。 这主è¦�用于优化解释器ã€�JIT 编译器或调试器。 (由 Carl Meyer 在 gh-91052 中贡献。)

  • 添加了 PyType_AddWatcher() å’Œ PyType_Watch() API 用于注册回调以接收类型å�˜æ›´é€šçŸ¥ã€‚ (由 Carl Meyer 在 gh-91051 中贡献。)

  • 添加了 PyCode_AddWatcher() å’Œ PyCode_ClearWatcher() API 用于注册回调以接收代ç �对象创建和销æ¯�时的通知。 (由 Itamar Oren 在 gh-91054 中贡献。)

  • 添加了 PyFrame_GetVar() å’Œ PyFrame_GetVarString() 函数用于通过å��ç§°æ�¥èŽ·å�–帧å�˜é‡�。 (由 Victor Stinner 在 gh-91248 中贡献。)

  • 添加 PyErr_GetRaisedException() å’Œ PyErr_SetRaisedException() 用于ä¿�存和æ�¢å¤�当å‰�异常。 这些函数返回并接å�—å�•个异常对象,而ä¸�是åƒ�现在已弃用的 PyErr_Fetch() å’Œ PyErr_Restore() 那样的三个å�‚数。 这样ä¸�容易出错并且更为高效。 (由 Mark Shannon 在 gh-101578 中贡献。)

  • 添加了 _PyErr_ChainExceptions1,它接å�—一个异常实例,用于å�–代旧å¼� API _PyErr_ChainExceptions,å�Žè€…现已被弃用。 (由 Mark Shannon 在 gh-101578 中贡献。)

  • 添加了 PyException_GetArgs() å’Œ PyException_SetArgs() 作为便æ�·å‡½æ•°ç”¨äºŽæ£€ç´¢å’Œä¿®æ”¹ä¼ é€’给异常的构造函数的 args。 (由 Mark Shannon 在 gh-101578 中贡献。)

  • 添加了 PyErr_DisplayException(),它接å�—一个异常实例,用于å�–代旧å¼� API PyErr_Display()。 (由 Irit Katriel 在 gh-102755 中贡献。)

  • PEP 683: 引入了 永生对象,它å…�许对象绕过引用计数,并对 C-API 进行相应修改:

    • _Py_IMMORTAL_REFCNT: 定义对象的引用计数

      为永生对象。

    • _Py_IsImmortal 检测一个对象是å�¦å…·æœ‰æ°¸ç”Ÿå¼•用计数。

    • PyObject_HEAD_INIT 这将把引用计数åˆ�始化为

      _Py_IMMORTAL_REFCNT 当�� Py_BUILD_CORE 使用时。

    • SSTATE_INTERNED_IMMORTAL 一个针对内部 unicode 对象的标识符

      为永生对象。

    • SSTATE_INTERNED_IMMORTAL_STATIC 一个针对内部 unicode

      为永生且��的对象

    • sys.getunicodeinternedsize 这将返回总计的 unicode

      被管�的对象。现在 refleak.py 需�这样�能正确地追踪引用计数和分�的�

    (由 Eddie Elizondo 在 gh-84436 中贡献。)

  • PEP 684: 新增了 Py_NewInterpreterFromConfig() 函数和 PyInterpreterConfig,å�¯ç”¨äºŽåˆ›å»ºå…·æœ‰å�•独 GIL çš„å­�解释器。 (更多信æ�¯å�‚è§� PEP 684: 解释器级 GIL。) (由 Eric Snow 在 gh-104110 中贡献。)

  • 在 3.12 版的å�—é™� C API 中,Py_INCREF() å’Œ Py_DECREF() 函数现在使用ä¸�é€�明函数调用的方å¼�实现以éš�è—�实现细节。 (由 Victor Stinner 在 gh-105387 中贡献。)

移�到 Python 3.12¶

  • 基于 Py_UNICODE* 表示形å¼�的旧å¼� Unicode API 已被移除。 请è¿�移到基于 UTF-8 或 wchar_t* çš„ API。

  • PyArg_ParseTuple() ç­‰å�‚æ•°è§£æž�函数ä¸�å†�支æŒ�基于 Py_UNICODE* 的格å¼�(例如 u, Z 等)。 请è¿�移到其他 Unicode æ ¼å¼�如 s, z, es å’Œ U。

  • tp_weaklist 对于所有é�™æ€�内置类型将始终为 NULL。 这是 PyTypeObject 上的一个内部专属字段,但我们还是è¦�指出这一å�˜åŒ–以防有人碰巧ä»�然直接访问到该字段。 为é�¿å…�出现中断,请考虑改用现有的公共 C-API,或在必è¦�时使用(仅é™�内部使用的)å®� _PyObject_GET_WEAKREFS_LISTPTR()。

  • 现在这个内部专用的 PyTypeObject.tp_subclasses å�¯èƒ½ä¸�是一个有效的对象指针。 为了å��映这一点我们将其类型改为 void*。 我们æ��到这一点是为了防止有人碰巧直接访问到这个内部专用字段。

    �获��类的列表,请调用 Python 方法 __subclasses__() (例如使用 PyObject_CallMethod())。

  • 在 PyUnicode_FromFormat() å’Œ PyUnicode_FromFormatV() 中添加对更多格å¼�选项(左对é½�ã€�八进制ã€�大写å��六进制ã€�intmax_tã€�ptrdiff_tã€�wchar_t C 字符串ã€�å�¯å�˜å®½åº¦å’Œç²¾åº¦ï¼‰çš„æ”¯æŒ�。 (由 Serhiy Storchaka 在 gh-98836 中贡献。)

  • PyUnicode_FromFormat() å’Œ PyUnicode_FromFormatV() 中未被识别的格å¼�字符现在会设置一个 SystemError。 在之å‰�的版本中它会导致格å¼�字符串的所有其他部分被原样å¤�制到结果字符串中,并丢弃任何é¢�外的å�‚数。 (由 Serhiy Storchaka 在 gh-95781 中贡献。)

  • ä¿®å¤�了 PyUnicode_FromFormat() å’Œ PyUnicode_FromFormatV() 中错误的标志ä½�置。 (由 Philip Georgi 在 gh-95504 中贡献。)

  • 希望添加 __dict__ 或弱引用槽ä½�的扩展类应分别使用 Py_TPFLAGS_MANAGED_DICT å’Œ Py_TPFLAGS_MANAGED_WEAKREF æ�¥ä»£æ›¿ tp_dictoffset å’Œ tp_weaklistoffset。 ç›®å‰�ä»�支æŒ�使用 tp_dictoffset å’Œ tp_weaklistoffset,但并ä¸�完全支æŒ�多é‡�继承 (gh-95589),而且性能å�¯èƒ½ä¼šå�˜å·®ã€‚ 声明了 Py_TPFLAGS_MANAGED_DICT 的类应当调用 _PyObject_VisitManagedDict() å’Œ _PyObject_ClearManagedDict() æ�¥é��历并清除它们的实例的字典。 è¦�清除弱引用,请åƒ�之å‰�一样调用 PyObject_ClearWeakRefs()。

  • PyUnicode_FSDecoder() 函数ä¸�å†�接å�—类似字节串的路径,如 bytearray å’Œ memoryview 类型:å�ªæŽ¥å�—明确的 bytes 类型字节字符串。 (由 Victor Stinner 在 gh-98393 中贡献。)

  • Py_CLEARã€�Py_SETREF å’Œ Py_XSETREF å®�现在å�ªä¼šå¯¹å…¶å�‚数求值一次。如果å�‚数有附带影å“�,这些附带影å“�å°†ä¸�会å†�é‡�å¤�。 (由 Victor Stinner 在 gh-98724 中贡献。)

  • 解释器的错误指示器现在总是规范化的。 è¿™æ„�味ç�€ PyErr_SetObject()ã€�PyErr_SetString() 以å�Šå…¶ä»–设置错误指示器的函数在ä¿�存异常之å‰�都会将其规范化。 (由 Mark Shannon 在 gh-101578 中贡献。)

  • _Py_RefTotal å·²ä¸�å†�具有é‡�è¦�性而ä¿�留它å�ªæ˜¯ä¸ºäº† ABI 的兼容性。 请注æ„�,这是一个内部全局å�˜é‡�并且仅在调试版本中å�¯ç”¨ã€‚ 如果你碰巧è¦�使用它那么你需è¦�开始使用 _Py_GetGlobalRefTotal()。

  • 下é�¢çš„函数将为新创建的类型选择一个å�ˆé€‚的元类:

    创建具有�载了 tp_new 的元类的类的�法已被弃用,在 Python 3.14+ 中将被�止。 请注�这些函数会忽略元类的 tp_new,从而�能导致�完整的�始化。

    请注� PyType_FromMetaclass() (在 Python 3.12 中新增) 已�止创建具有�载了 tp_new (在 Python 中为 __new__() ) 的元类的类。

    由于 tp_new �载了``PyType_From*`` 函数的几乎所有内容,因此两者互�兼容。 现有的行为 -- 在创建类型的一些步骤中忽略元类 -- 通常都是�安全的,因为(元)类会�定 tp_new 已被调用。 目�还没有简�通用的绕过方�。 以下办法之一�能对你有用:

    • 如果你控制ç�€å…ƒç±»ï¼Œè¯·é�¿å…�在其中使用 tp_new:

      • 如åˆ�始化å�¯è¢«è·³è¿‡ï¼Œåˆ™å�¯ä»¥æ”¹åœ¨ tp_init 中完æˆ�。

      • 如果元类ä¸�需è¦�从 Python 执行实例化,则使用 Py_TPFLAGS_DISALLOW_INSTANTIATION 旗标将其 tp_new 设为 NULL。 这将使其å�¯è¢« PyType_From* 函数接å�—。

    • é�¿å…�使用 PyType_From* 函数:如果ä¸�需è¦� C 专属的特性(槽ä½�或设置实例大å°�),请通过 调用 元类æ�¥åˆ›å»ºç±»åž‹ã€‚

    • 如果你 知é�“ å�¯ä»¥å®‰å…¨åœ°è·³è¿‡ tp_new,就使用 Python 中的 warnings.catch_warnings() 过滤掉弃用警告。

  • PyOS_InputHook å’Œ PyOS_ReadlineFunctionPointer å°†ä¸�å†�在 å­�解释器 中被调用。 这是因为客户端通常ä¾�赖进程级的全局状æ€�(而这些回调没有办法æ�¢å¤�扩展模å�—状æ€�)。

    这也��了扩展程�在�支�(或尚未被加载)的�解释器中�行的情况。 请�阅 gh-104668 了解更多信�。

  • PyLongObject 对其内部字段进行了修改以æ��高性能。 虽然 PyLongObject 的内部字段是ç§�有的,但æŸ�些扩展模å�—会使用它们。 内部字段ä¸�应å†�被直接访问,而应改用以 PyLong_... 打头的 API 函数。 新增了两个 暂定 API 函数用于高效访问适é…�至å�•个机器字的 PyLongObject 的值:

  • 通过 PyMem_SetAllocator() 设置的自定义分é…�器现在必须是线程安全的,无论内存域是什么。 没有自己的状æ€�的分é…�器,包括“钩å­�â€�å°†ä¸�会å�—å½±å“�。 如果你的自定义分é…�器还ä¸�是线程安全的且你需è¦�指导则请创建一个新的 GitHub 问题并抄é€�ç»™ @ericsnowcurrently。

弃用¶

计划在 Python 3.14 中移除¶

Python 3.15 中的待移除功能¶

计划在未�版本中移除¶

以下 API 已被弃用,将被移除,但目�尚未确定移除日期。

移除¶

  • 移除 token.h 头文件。从æ�¥å°±æ²¡æœ‰ä»»ä½•公开的 C 语言标记程åº�接å�£ã€‚ token.h 头文件å�ªæ˜¯ä¸º Python 内部使用而设计的。(ç”± Victor Stinner 在 gh-92651 æ��供)。

  • æ—§å¼� Unicode API 已被移除。 请å�‚阅 PEP 623 了解详情。for detail.

    • PyUnicode_WCHAR_KIND

    • PyUnicode_AS_UNICODE()

    • PyUnicode_AsUnicode()

    • PyUnicode_AsUnicodeAndSize()

    • PyUnicode_AS_DATA()

    • PyUnicode_FromUnicode()

    • PyUnicode_GET_SIZE()

    • PyUnicode_GetSize()

    • PyUnicode_GET_DATA_SIZE()

  • 移除了 PyUnicode_InternImmortal() 函数å®�。 (由 Victor Stinner 在 gh-85858 中贡献。).)