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 701,f-å—符串 è¯æ³•的改进
解释器的改进:
PEP 669,低开销的监控
针对
NameError,ImportError和SyntaxError异常 改进了 'Did you mean ...' �示消�。
对 Python 数�模型的改进:
PEP 688,使用 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 的改进:
CPython 实现的改进:
PEP 709,推导�内�化
对 Linux
perf性能分æž�器的 CPython 支æŒ�在å�—支æŒ�的平å�°ä¸Šå®žçŽ°æ ˆæº¢å‡ºä¿�护
æ–°çš„ç±»åž‹æ ‡æ³¨ç‰¹æ€§ï¼š
PEP 698,
typing.override()装饰器
��的弃用�移除或�制:
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¶
æ·»åŠ äº†
random.binomialvariate()。 (由 Raymond Hettinger 在 gh-81620 ä¸è´¡çŒ®ã€‚)在
random.expovariate()䏿·»åŠ é»˜è®¤å€¼lambd=1.0。 (由 Raymond Hettinger 在 gh-100234 ä¸è´¡çŒ®ã€‚)
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¶
å¢žåŠ äº†ä¸€ä¸ª 命令行接å�£ã€‚ (由 Erlend E. Aasland 在 gh-77617 ä¸è´¡çŒ®ã€‚)
�
sqlite3.Connectionæ·»åŠsqlite3.Connection.autocommit属性并å�‘sqlite3.connect()æ·»åŠ autocommit å½¢å�‚用于控制兼容 PEP 249 çš„ 事务处ç�†ã€‚ (由 Erlend E. Aasland 在 gh-83638 ä¸è´¡çŒ®ã€‚)å�‘
sqlite3.Connection.load_extension()æ·»åŠ entrypoint ä»…é™�关键å—å½¢å�‚,用于覆盖 SQLite 扩展入å�£ç‚¹ã€‚ (由 Erlend E. Aasland 在 gh-103015 ä¸è´¡çŒ®ã€‚)å�‘
sqlite3.Connectionæ·»åŠsqlite3.Connection.getconfig()å’Œsqlite3.Connection.setconfig()用于对数æ�®åº“连接进行é…�置修改。 (由 Erlend E. Aasland 在 gh-103489 ä¸è´¡çŒ®ã€‚)
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¶
å¢žåŠ äº†
types.get_original_bases()以å…�许在å�类化时继ç»å¯¹ 用户定义的泛型类型 进行内çœ�。 (由 James Hilton-Balfe å’Œ Alex Waygood 在 gh-101827 ä¸è´¡çŒ®ã€‚)
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¶
å¢žåŠ äº†ä¸€ä¸ª 命令行接å�£ã€‚ (由 Adam Chhina 在 gh-88597 ä¸è´¡çŒ®ã€‚)
性能优化¶
从 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.Numast.Strast.Bytesast.NameConstantast.Ellipsis
请改用
ast.Constant。 (由 Serhiy Storchaka 在 gh-90953 ä¸è´¡çŒ®ã€‚)-
å�监视器类
asyncio.MultiLoopChildWatcher,asyncio.FastChildWatcher,asyncio.AbstractChildWatcherå’Œasyncio.SafeChildWatcher已被弃用并将在 Python 3.14 ä¸ç§»é™¤ã€‚ (由 Kumar Aditya 在 gh-94597 ä¸è´¡çŒ®ã€‚)asyncio.set_child_watcher()ã€�asyncio.get_child_watcher()ã€�asyncio.AbstractEventLoopPolicy.set_child_watcher()å’Œasyncio.AbstractEventLoopPolicy.get_child_watcher()已弃用,并将在 Python 3.14 ä¸ç§»é™¤ã€‚(由 Kumar Aditya 在 gh-94597 ä¸è´¡çŒ®ã€‚)现在默认事件循环ç–略的
get_event_loop()方法在当å‰�事件循环未设置并决定创建一个时将å�‘出DeprecationWarning。 (由 Serhiy Storchaka å’Œ Guido van Rossum 在 gh-100160 ä¸è´¡çŒ®ã€‚)
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.ResourceReaderimportlib.abc.Traversableimportlib.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 ä¸è´¡çŒ®ã€‚)-
默认适é…�器和转æ�¢å™¨ 现在已被弃用,请使用 适é…�器和转æ�¢å™¨èŒƒä¾‹ç¨‹åº� å¹¶æ ¹æ�®ä½ 的需è¦�调整它们。 (由 Erlend E. Aasland 在 gh-90016 ä¸è´¡çŒ®ã€‚)
在
execute()ä¸ï¼ŒçŽ°åœ¨å½“ 命å��å� ä½�符 与作为 sequence 而ä¸�是dictæ��供的形å�‚一起使用时将å�‘出DeprecationWarning。 从 Python 3.14 开始,当命å��å� ä½�符与作为åº�列æ��供的形å�‚一起使用时将引å�‘ProgrammingError。 (由 Erlend E. Aasland 在 gh-101698 ä¸è´¡çŒ®ã€‚)
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.Hashableå’Œtyping.Sized,分别为collections.abc.Hashableå’Œcollections.abc.Sized的别å��,现已被弃用。 (gh-94309。)typing.ByteString自 Python 3.9 起已被弃用,现在当被使用时将会å�‘出DeprecationWarning。 (由 Alex Waygood 在 gh-91896 ä¸è´¡çŒ®ã€‚)
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:
configparser.LegacyInterpolation(gh-90765)locale.resetlocale()(gh-90817)turtle.RawTurtle.settiltangle()(gh-50096)unittest.findTestCases()(gh-50096)unittest.getTestCaseNames()(gh-50096)unittest.makeSuite()(gh-50096)unittest.TestProgram.usageExit()(gh-67048)webbrowser.MacOSX(gh-86421)classmethodæ��述器串è�” (gh-89519)importlib.resourcesä¸å·²å¼ƒç”¨çš„æ–¹æ³•:contents()is_resource()open_binary()open_text()path()read_binary()read_text()
请改用
importlib.resources.files()。 �� importlib-resources: Migrating from Legacy (gh-106531)
计划在 Python 3.14 ä¸ç§»é™¤Â¶
以下 API 已被弃用并将在 Python 3.14 ä¸ç§»é™¤ã€‚
argparse:argparse.BooleanOptionalAction的 type, choices 和 metavar 形�ast:ast.Numast.Strast.Bytesast.NameConstantast.Ellipsis
-
asyncio.MultiLoopChildWatcherasyncio.FastChildWatcherasyncio.AbstractChildWatcherasyncio.SafeChildWatcherasyncio.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.ResourceReaderimportlib.abc.Traversableimportlib.abc.TraversableResources
itertools: 对 copy, deepcopy 和 pickle �作的支�。-
pkgutil.find_loader()pkgutil.get_loader()。
pty:pty.master_open()pty.slave_open()
shutil:shutil.rmtree()的 onerror �数typing:typing.ByteStringxml.etree.ElementTree: 对xml.etree.ElementTree.Element的真值测试。模�对象上的
__package__å’Œ__cached__属性。代ç �对象的
co_lnotab属性。
Python 3.15 ä¸çš„待移除功能¶
以下 API 已被弃用并将在 Python 3.15 ä¸ç§»é™¤ã€‚
API:
计划在未æ�¥ç‰ˆæœ¬ä¸ç§»é™¤Â¶
下列 API 在更早的 Python 版本ä¸å·²è¢«å¼ƒç”¨å¹¶å°†è¢«ç§»é™¤ï¼Œä½†ç›®å‰�还没有确定它们的移除日期。
ç›®å‰� 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¶
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¶
ftplib¶
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_cacheimp.cache_from_source()imp.find_module()imp.get_magic()imp.get_suffixes()importlib.machinery.SOURCE_SUFFIXES,importlib.machinery.EXTENSION_SUFFIXES和importlib.machinery.BYTECODE_SUFFIXESimp.get_tag()imp.load_module()imp.new_module(name)types.ModuleType(name)imp.reload()imp.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¶
locale¶
移除了
localeçš„locale.format()函数,它在 Python 3.7 ä¸å·²è¢«å¼ƒç”¨ï¼šè¯·æ”¹ç”¨locale.format_string()。 (由 Victor Stinner 在 gh-94226 ä¸è´¡çŒ®ã€‚)
smtpd¶
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¶
移除了许多早已弃用的
unittest特性:一些
TestCase方法的别�:已弃用的别�
方法�
弃用于
failUnless3.1
failIf3.1
failUnlessEqual3.1
failIfEqual3.1
failUnlessAlmostEqual3.1
failIfAlmostEqual3.1
failUnlessRaises3.1
assert_3.2
assertEquals3.2
assertNotEquals3.2
assertAlmostEquals3.2
assertNotAlmostEquals3.2
assertRegexpMatches3.2
assertRaisesRegexp3.2
assertNotRegexpMatches3.5
您å�¯ä»¥ä½¿ç”¨ https://github.com/isidentical/teyit æ�¥è‡ªåŠ¨æ›´æ–°ä½ çš„å�•元测试。
未写入文档且已��用的
TestCase方法assertDictContainsSubset。 (在 Python 3.2 ä¸å·²å¼ƒç”¨ã€‚)未写入文档的
TestLoader.loadTestsFromModuleå½¢å�‚ use_load_tests。 (自 Python 3.2 起已弃用并被忽略。)TextTestResult类的一个别å��:_TextTestResult。 (在 Python 3.2 ä¸å·²å¼ƒç”¨ã€‚)
(由 Serhiy Storchaka 在 gh-89325 ä¸è´¡çŒ®ã€‚)
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¶
其他事项¶
从文档
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-basedsmtpd模å�—。 推è��使用基于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:
PyType_Spec.basicsizeå�¯ä»¥ä¸ºé›¶æˆ–负数,用于以指定继承或扩展基类的大å°�ã€‚å¢žåŠ äº†
PyObject_GetTypeData()å’ŒPyType_GetTypeDataSize()以å…�许访问特定å�类的实例数æ�®ã€‚æ·»åŠ äº†
Py_TPFLAGS_ITEMS_AT_ENDå’ŒPyObject_GetItemData()以å…�许安全地扩展æŸ�些å�¯å�˜å¤§å°�的类型,包括PyType_Typeã€‚æ·»åŠ äº†
Py_RELATIVE_OFFSET以å…�许用特定于å�类的结构体æ�¥å®šä¹‰æˆ�员。
(由 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(),它接å�—一个异常实例,用于å�–代旧å¼� APIPyErr_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_tC å—符串ã€�å�¯å�˜å®½åº¦å’Œç²¾åº¦ï¼‰çš„æ”¯æŒ�。 (由 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。
弃用¶
æ ¹æ�® PEP 699 çš„è¦�求,
PyDictObjectä¸çš„ma_version_tagå—æ®µå¯¹äºŽæ‰©å±•模å�—已被弃用。 è®¿é—®è¯¥å—æ®µå°†åœ¨ç¼–译时生æˆ�编译器è¦å‘Šã€‚ è¯¥å—æ®µå°†åœ¨ Python 3.14 ä¸ç§»é™¤ã€‚ (由 Ramvikrams å’Œ Kumar Aditya 在 gh-101193 ä¸è´¡çŒ®ã€‚ PEP ç”± Ken Jin 撰写。)已弃用的全局é…�ç½®å�˜é‡�:
Py_DebugFlag: 使用PyConfig.parser_debugPy_VerboseFlag: 使用PyConfig.verbosePy_QuietFlag: 使用PyConfig.quietPy_InspectFlag: 使用PyConfig.inspectPy_NoSiteFlag: 使用PyConfig.site_importPy_HashRandomizationFlag: 使用PyConfig.use_hash_seed和PyConfig.hash_seedPy_IsolatedFlag: 使用PyConfig.isolatedPy_LegacyWindowsFSEncodingFlag: 使用PyPreConfig.legacy_windows_fs_encodingPy_LegacyWindowsStdioFlag: 使用PyConfig.legacy_windows_stdioPy_FileSystemDefaultEncoding: 使用PyConfig.filesystem_encodingPy_HasFileSystemDefaultEncoding: 使用PyConfig.filesystem_encodingPy_FileSystemDefaultEncodeErrors: 使用PyConfig.filesystem_errorsPy_UTF8Mode: 使用PyPreConfig.utf8_mode(��Py_PreInitialize())
Py_InitializeFromConfig()API 应当改为使用PyConfig。 (由 Victor Stinner 在 gh-77782 ä¸è´¡çŒ®ã€‚)使用å�¯å�˜çš„基类创建
ä¸�å�¯å�˜ç±»åž‹çš„å�šæ³•å·²è¢«å¼ƒç”¨å¹¶å°†åœ¨ Python 3.14 ä¸è¢«ç¦�用。 (gh-95388)structmember.h头文件已被弃用,ä¸�过它ä»�å�¯ç»§ç»ä½¿ç”¨ä¹Ÿæ²¡æœ‰è®¡åˆ’将其移除。现在å�ªéœ€åŒ…括
Python.hå�³å�¯èŽ·å¾—å…¶å†…å®¹ï¼Œå¦‚æžœæ‰¾ä¸�到请添åŠPyå‰�缀:类型å®�如
Py_T_INT,Py_T_DOUBLEç‰ï¼ˆä¹‹å‰�为T_INT,T_DOUBLEç‰ï¼‰æ——æ ‡
Py_READONLY(之�为READONLY) 和Py_AUDIT_READ(之�为全大写形�)
Python.hä¸Šæœ‰å‡ ä¸ªé¡¹ç›®æ²¡æœ‰æš´éœ²ï¼šT_OBJECT(使用Py_T_OBJECT_EX)T_NONE(之å‰�未写入文档,并且相当怪异)ä¸�进行任何æ“�作的å®�
WRITE_RESTRICTED。RESTRICTEDå’ŒREAD_RESTRICTEDå®�,ç‰å�ŒäºŽPy_AUDIT_READ。在æŸ�些é…�ç½®ä¸ï¼Œ
Python.h未包�<stddef.h>。使用offsetof()时,应手动将其包�在内。
已被弃用的头文件将继ç»ä»¥åŽŸæ�¥çš„å��ç§°æ��供原æ�¥çš„内容。 ä½ çš„æ—§ä»£ç �å�¯ä»¥ä¿�æŒ�ä¸�å�˜ï¼Œé™¤é�žé¢�å¤–çš„åŒ…æ‹¬æŒ‡ä»¤å’Œæ— å‘½å��空间å®�ä¼šç»™ä½ å¸¦æ�¥å¾ˆå¤§å›°æ‰°ã€‚
(由 Petr Viktorin 在 gh-47146 ä¸è´¡çŒ®ï¼ŒåŸºäºŽ Alexander Belopolsky å’Œ Matthias Braun 在先å‰�的工作。).)
PyErr_Fetch()å’ŒPyErr_Restore()已被弃用。请使用PyErr_GetRaisedException()å’ŒPyErr_SetRaisedException()代替。(ç”± Mark Shannon 在:gh:101578 贡献)。PyErr_Display()已被弃用,请改用PyErr_DisplayException()。 (由 Irit Katriel 在 gh-102755 ä¸è´¡çŒ®ã€‚)_PyErr_ChainExceptions已被弃用。 请改用_PyErr_ChainExceptions1。 (由 Irit Katriel 在 gh-102192 ä¸è´¡çŒ®ã€‚)使用
PyType_FromSpec(),PyType_FromSpecWithBases()或PyType_FromModuleAndSpec()�创建所属元类�载了tp_new的类的�法已被弃用。 请改为调用相应元类。is deprecated. Call the metaclass instead.
计划在 Python 3.14 ä¸ç§»é™¤Â¶
PyDictObjectä¸çš„ma_version_tagå—æ®µç”¨äºŽæ‰©å±•模å�— ( PEP 699 ; gh-101193 )。全局é…�ç½®å�˜é‡�:
Py_DebugFlag: 使用PyConfig.parser_debugPy_VerboseFlag: 使用PyConfig.verbosePy_QuietFlag: 使用PyConfig.quietPy_InspectFlag: 使用PyConfig.inspectPy_NoSiteFlag: 使用PyConfig.site_importPy_HashRandomizationFlag: 使用PyConfig.use_hash_seed和PyConfig.hash_seedPy_IsolatedFlag: 使用PyConfig.isolatedPy_LegacyWindowsFSEncodingFlag: 使用PyPreConfig.legacy_windows_fs_encodingPy_LegacyWindowsStdioFlag: 使用PyConfig.legacy_windows_stdioPy_FileSystemDefaultEncoding: 使用PyConfig.filesystem_encodingPy_HasFileSystemDefaultEncoding: 使用PyConfig.filesystem_encodingPy_FileSystemDefaultEncodeErrors: 使用PyConfig.filesystem_errorsPy_UTF8Mode: 使用PyPreConfig.utf8_mode(��Py_PreInitialize())
Py_InitializeFromConfig()API 应与PyConfig一起使用。创建
immutable types的��基础 ( gh-95388 )。
Python 3.15 ä¸çš„待移除功能¶
PyImport_ImportModuleNoBlock():使用PyImport_ImportModule()Py_UNICODE_WIDE类型:使用wchar_tPy_UNICODE类型:使用wchar_tPython �始化函数
PySys_ResetWarnOptions():清除sys.warnoptions和warnings.filtersPy_GetExecPrefix():获�sys.exec_prefixPy_GetPath():获�sys.pathPy_GetPrefix():获�sys.prefixPy_GetProgramFullPath():获�sys.executablePy_GetProgramName():获�sys.executablePy_GetPythonHome():获�PyConfig.home或PYTHONHOME环境��
计划在未æ�¥ç‰ˆæœ¬ä¸ç§»é™¤Â¶
以下 API 已被弃用,将被移除,但目�尚未确定移除日期。
Py_TPFLAGS_HAVE_FINALIZE:自 Python 3.8 èµ·ä¸�å†�需è¦�PyErr_Fetch(): 使用PyErr_GetRaisedException()PyErr_NormalizeException():使用PyErr_GetRaisedException()PySlice_GetIndicesEx():使用PySlice_Unpack()å’ŒPySlice_AdjustIndices()PyUnicode_AsDecodedObject():使用PyCodec_Decode()PyUnicode_AsDecodedUnicode():使用PyCodec_Decode()PyUnicode_AsEncodedObject(): 使用PyCodec_Encode()PyUnicode_AsEncodedUnicode():使用PyCodec_Encode()PyUnicode_READY():自 Python 3.12 èµ·ä¸�å†�需è¦�PyErr_Display():使用PyErr_DisplayException()_PyErr_ChainExceptions():使用_PyErr_ChainExceptions1PyBytesObject.ob_shashæˆ�员:改用PyObject_Hash()PyDictObject.ma_version_tagæˆ�员线程本地å˜å‚¨ (TLS) API:
PyThread_create_key():使用PyThread_tss_alloc()PyThread_delete_key():使用PyThread_tss_free()PyThread_set_key_value():使用PyThread_tss_set()PyThread_ReInitTLS():自 Python 3.7 起��需�
移除¶
移除
token.h头文件。从æ�¥å°±æ²¡æœ‰ä»»ä½•公开的 C è¯è¨€æ ‡è®°ç¨‹åº�接å�£ã€‚token.h头文件å�ªæ˜¯ä¸º Python 内部使用而设计的。(ç”± Victor Stinner 在 gh-92651 æ��供)。旧å¼� Unicode API 已被移除。 请å�‚阅 PEP 623 了解详情。for detail.
PyUnicode_WCHAR_KINDPyUnicode_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 ä¸è´¡çŒ®ã€‚).)