Python 3.10 有什么新�化¶
- 编者:
Pablo Galindo Salgado
è¿™ç¯‡æ–‡ç« ä»‹ç»�了 Python 3.10 相比 3.9 å¢žåŠ çš„æ–°ç‰¹æ€§ã€‚ Python 3.10 å�‘布于 2021 å¹´ 10 月 14 日。 更详细的信æ�¯å�¯å�‚阅 更新日志。
摘� -- �布�点¶
æ–°çš„è¯æ³•特性:
PEP 634, 结构化模�匹�: 规范说明
PEP 635, 结构化模�匹�: 动机与�由
PEP 636, 结构化模�匹�: 教程
bpo-12782ï¼ŒåŠ åœ†æ‹¬å�·çš„上下文管ç�†å™¨çŽ°åœ¨æ£å¼�被å…�许使用。
æ ‡å‡†åº“ä¸çš„æ–°ç‰¹æ€§ï¼š
PEP 618,å�‘ zip æ·»åŠ å�¯é€‰çš„长度检查。
解释器的改进:
PEP 626,在调试和其他工具ä¸ä½¿ç”¨ç²¾ç¡®çš„行å�·ã€‚
æ–°çš„ç±»åž‹æ ‡æ³¨ç‰¹æ€§ï¼š
PEP 604,�许 X | Y 形�的��类型写法
PEP 612,形å�‚è§„æ ¼å�˜é‡�
PEP 613,显�类型别�
PEP 647,用户自定义的类型�护器
��的弃用�移除或�制:
新的特性¶
带圆括�的上下文管�器¶
现在已支æŒ�使用外层圆括å�·æ�¥ä½¿å¤šä¸ªä¸Šä¸‹æ–‡ç®¡ç�†å™¨å�¯ä»¥è¿žç»å¤šè¡Œåœ°ä¹¦å†™ã€‚ è¿™å…�许将过长的上下文管ç�†å™¨é›†èƒ½å¤Ÿä»¥ä¸Žä¹‹å‰� import è¯å�¥ç±»ä¼¼çš„æ–¹å¼�æ ¼å¼�化为多行的形å¼�。 例如,以下这些示例写法现在都是有效的:
with (CtxManager() as example):
...
with (
CtxManager1(),
CtxManager2()
):
...
with (CtxManager1() as example,
CtxManager2()):
...
with (CtxManager1(),
CtxManager2() as example):
...
with (
CtxManager1() as example1,
CtxManager2() as example2
):
...
在被包�的分组末尾过�以使用一个逗�作为结�:
with (
CtxManager1() as example1,
CtxManager2() as example2,
CtxManager3() as example3,
):
...
è¿™ä¸ªæ–°è¯æ³•使用了新解æž�器的é�ž LL(1) 功能。 请查看 PEP 617 æ�¥äº†è§£æ›´å¤šç»†èŠ‚ã€‚
(由 Guido van Rossum, Pablo Galindo å’Œ Lysandros Nikolaou 在 bpo-12782 å’Œ bpo-40334 ä¸è´¡çŒ®ã€‚)
更清楚的错误消�¶
SyntaxError¶
现在当解æž�包å�«æœ‰æœªå…³é—括å�·çš„代ç �æ—¶è§£é‡Šå™¨ä¼šåŒ…æ‹¬æœªå…³é—æ‹¬å�·çš„ä½�置而ä¸�是显示 SyntaxError: unexpected EOF while parsing 并指å�‘æŸ�个ä¸�æ£ç¡®çš„ä½�置。 例如,考虑以下代ç �(注æ„�未关é—çš„ “ { â€�):
expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
38: 4, 39: 4, 45: 5, 46: 5, 47: 5, 48: 5, 49: 5, 54: 6,
some_other_code = foo()
之å‰�ç‰ˆæœ¬çš„è§£é‡Šå™¨ä¼šæŠ¥å‘Šä»¤äººè¿·æƒ‘çš„è¯æ³•错误ä½�置:
File "example.py", line 3
some_other_code = foo()
^
SyntaxError: invalid syntax
但在 Python 3.10 ä¸åˆ™ä¼šå�‘出信æ�¯é‡�更多的错误æ��示:
File "example.py", line 1
expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
^
SyntaxError: '{' was never closed
类似地,涉å�Šæœªå…³é—å—符串å—é�¢å€¼ (å�•é‡�引å�·å’Œä¸‰é‡�引å�·) 的错误现在会指å�‘å—符串的开头而ä¸�是报告 EOF/EOL。
这些改进的�感�自 PyPy 解释器之�所进行的工作。
(由 Pablo Galindo 在 bpo-42864 以å�Š Batuhan Taskaya 在 bpo-40176 ä¸è´¡çŒ®ã€‚)
解释器所引å�‘çš„ SyntaxError 异常现在将高亮构æˆ�è¯æ³•错误本身的完整异常错误内容,而ä¸�是仅æ��示检测到问题的ä½�置。 è¿™æ ·ï¼Œä¸�å†�(å�Œ Python 3.10 之å‰�é‚£æ ·ï¼‰ä»…æ˜¾ç¤ºï¼š
>>> foo(x, z for z in range(10), t, w)
File "<stdin>", line 1
foo(x, z for z in range(10), t, w)
^
SyntaxError: Generator expression must be parenthesized
现在 Python 3.10 å°†è¿™æ ·æ˜¾ç¤ºå¼‚å¸¸ï¼š
>>> foo(x, z for z in range(10), t, w)
File "<stdin>", line 1
foo(x, z for z in range(10), t, w)
^^^^^^^^^^^^^^^^^^^^
SyntaxError: Generator expression must be parenthesized
这个改进是由 Pablo Galindo 在 bpo-43914 ä¸è´¡çŒ®çš„。
大é‡�新增的专门化 SyntaxError 异常消æ�¯å·²è¢«æ·»åŠ ã€‚ 其䏿œ€ä¸»è¦�的一些如下所示:
在代ç �å�—之å‰�缺失
::>>> if rocket.position > event_horizon File "<stdin>", line 1 if rocket.position > event_horizon ^ SyntaxError: expected ':'
(由 Pablo Galindo 在 bpo-42997 ä¸è´¡çŒ®ã€‚)
在推导å¼�çš„ç›®æ ‡ä¸æœ‰ä¸�带圆括å�·çš„元组:
>>> {x,y for x,y in zip('abcd', '1234')} File "<stdin>", line 1 {x,y for x,y in zip('abcd', '1234')} ^ SyntaxError: did you forget parentheses around the comprehension target?
(由 Pablo Galindo 在 bpo-43017 ä¸è´¡çŒ®ã€‚)
在多项集å—é�¢å€¼ä¸å’Œè¡¨è¾¾å¼�之间缺失逗å�·:
>>> items = { ... x: 1, ... y: 2 ... z: 3, File "<stdin>", line 3 y: 2 ^ SyntaxError: invalid syntax. Perhaps you forgot a comma?
(由 Pablo Galindo 在 bpo-43822 ä¸è´¡çŒ®ã€‚)
多个异常类型�带圆括�:
>>> try: ... build_dyson_sphere() ... except NotEnoughScienceError, NotEnoughResourcesError: File "<stdin>", line 3 except NotEnoughScienceError, NotEnoughResourcesError: ^ SyntaxError: multiple exception types must be parenthesized
(由 Pablo Galindo 在 bpo-43149 ä¸è´¡çŒ®ã€‚)
å—å…¸å—é�¢å€¼ä¸ç¼ºå¤±
:和值:>>> values = { ... x: 1, ... y: 2, ... z: ... } File "<stdin>", line 4 z: ^ SyntaxError: expression expected after dictionary key and ':' >>> values = {x:1, y:2, z w:3} File "<stdin>", line 1 values = {x:1, y:2, z w:3} ^ SyntaxError: ':' expected after dictionary key
(由 Pablo Galindo 在 bpo-43823 ä¸è´¡çŒ®ã€‚)
try代ç �å�—ä¸�带except或finally代ç �å�—:>>> try: ... x = 2 ... something = 3 File "<stdin>", line 3 something = 3 ^^^^^^^^^ SyntaxError: expected 'except' or 'finally' block
(由 Pablo Galindo 在 bpo-44305 ä¸è´¡çŒ®ã€‚)
在比较ä¸ä½¿ç”¨
=而�是==:>>> if rocket.position = event_horizon: File "<stdin>", line 1 if rocket.position = event_horizon: ^ SyntaxError: cannot assign to attribute here. Maybe you meant '==' instead of '='?
(由 Pablo Galindo 在 bpo-43797 ä¸è´¡çŒ®ã€‚)
在 f-å—符串ä¸ä½¿ç”¨
*:>>> f"Black holes {*all_black_holes} and revelations" File "<stdin>", line 1 (*all_black_holes) ^ SyntaxError: f-string: cannot use starred expression here
(由 Pablo Galindo 在 bpo-41064 ä¸è´¡çŒ®ã€‚)
IndentationError¶
许多 IndentationError 异常现在具有更多上下文æ�¥æ��示是何ç§�代ç �å�—需è¦�缩进,包括è¯å�¥çš„ä½�置:
>>> def foo():
... if lel:
... x = 2
File "<stdin>", line 3
x = 2
^
IndentationError: expected an indented block after 'if' statement in line 2
AttributeError¶
当打å�° AttributeError 时,PyErr_Display() å°†æ��供引å�‘异常的对象ä¸ç±»ä¼¼å±žæ€§å��称的建议:
>>> collections.namedtoplo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'collections' has no attribute 'namedtoplo'. Did you mean: namedtuple?
(由 Pablo Galindo 在 bpo-38530 ä¸è´¡çŒ®ã€‚)
è¦å‘Š
请注æ„�如果未调用 PyErr_Display() æ�¥æ˜¾ç¤ºé”™è¯¯åˆ™æ¤ç‰¹æ€§å°†æ²¡æœ‰æ•ˆæžœï¼Œè¿™å�¯èƒ½å�‘生在使用了æŸ�些其他自定义错误显示函数的时候。 这在æŸ�些 REPL 例如 IPython 上是一ç§�常è§�的情况。
NameError¶
当打å�°è§£é‡Šå™¨æ‰€å¼•å�‘çš„ NameError 时,PyErr_Display() å°†æ��供引å�‘异常的函数ä¸ç±»ä¼¼å�˜é‡�å��称的建议:
>>> schwarzschild_black_hole = None
>>> schwarschild_black_hole
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'schwarschild_black_hole' is not defined. Did you mean: schwarzschild_black_hole?
(由 Pablo Galindo 在 bpo-38530 ä¸è´¡çŒ®ã€‚)
è¦å‘Š
请注æ„�如果未调用 PyErr_Display() æ�¥æ˜¾ç¤ºé”™è¯¯åˆ™æ¤ç‰¹æ€§å°†æ²¡æœ‰æ•ˆæžœï¼Œè¿™å�¯èƒ½å�‘生在使用了æŸ�些其他自定义错误显示函数的时候。 这在æŸ�些 REPL 例如 IPython 䏿˜¯ä¸€ç§�常è§�的情况。
PEP 626:在调试和其他工具ä¸ä½¿ç”¨ç²¾ç¡®çš„行å�·Â¶
PEP 626 带æ�¥äº†æ›´ç²¾ç¡®å�¯é� 的行å�·ç”¨äºŽè°ƒè¯•ã€�性能分æž�和测试工具。 所有被执行的代ç �行都会并且å�ªæœ‰è¢«æ‰§è¡Œçš„代ç �行æ‰�会生æˆ�带有æ£ç¡®è¡Œå�·çš„追踪事件。
帧对象的 f_lineno 属性将总是包�预期的行�。
代ç �对象 的的 co_lnotab 属性已被弃用并将在 3.12 ä¸è¢«ç§»é™¤ã€‚ 需è¦�从å��ç§»é‡�转æ�¢ä¸ºè¡Œå�·çš„代ç �应当改用新的 co_lines() 方法。
PEP 634:结构化模�匹�¶
å¢žåŠ äº†é‡‡ç”¨æ¨¡å¼�åŠ ä¸Šç›¸åº”åŠ¨ä½œçš„ match è¯å�¥ å’Œ case è¯å�¥ 的形å¼�的结构化模å¼�匹é…�。 模å¼�ç”±åº�列ã€�æ˜ å°„ã€�基本数æ�®ç±»åž‹ä»¥å�Šç±»å®žä¾‹æž„æˆ�。 模å¼�匹é…�使得程åº�能够从å¤�æ�‚的数æ�®ç±»åž‹ä¸æ��å�–ä¿¡æ�¯ã€�æ ¹æ�®æ•°æ�®ç»“构实现分支,并基于ä¸�å�Œçš„æ•°æ�®å½¢å¼�应用特定的动作。
è¯æ³•与æ“�作¶
模å¼�匹é…�çš„é€šç”¨è¯æ³•如下:
match subject:
case <pattern_1>:
<action_1>
case <pattern_2>:
<action_2>
case <pattern_3>:
<action_3>
case _:
<action_wildcard>
match è¯å�¥æŽ¥å�—一个表达å¼�并将其值与以一个或多个 case è¯å�¥å�—å½¢å¼�给出的一系列模å¼�进行比较。 具体æ�¥è¯´ï¼Œæ¨¡å¼�匹é…�çš„æ“�作如下:
使用具有特定类型和形状的数� (
subject)针对
subject在matchè¯å�¥ä¸æ±‚值从上到下对 subject 与
caseè¯å�¥ä¸çš„æ¯�个模å¼�进行比较直到确认匹é…�到一个模å¼�。执行与被确认匹é…�的模å¼�相关è�”的动作。
如果没有确认到一个完全的匹�,则如果�供了使用通�符
_的最å�Žä¸€ä¸ª case è¯å�¥ï¼Œåˆ™å®ƒå°†è¢«ç”¨ä½œå·²åŒ¹é…�模å¼�。 如果没有确认到一个完全的匹é…�并且ä¸�å˜åœ¨ä½¿ç”¨é€šé…�符的 case è¯å�¥ï¼Œåˆ™æ•´ä¸ª match 代ç �å�—ä¸�执行任何æ“�作。
声明性方�¶
读者å�¯èƒ½æ˜¯é€šè¿‡ C, Java 或 JavaScript (以å�Šå…¶ä»–许多è¯è¨€) ä¸çš„ switch è¯å�¥å°†ä¸€ä¸ªç›®æ ‡ (æ•°æ�®å¯¹è±¡) 与一个å—é�¢å€¼ (模å¼�) 进行匹é…�的简å�•例å�了解到模å¼�匹é…�的概念的。 switch è¯å�¥å¸¸å¸¸è¢«ç”¨æ�¥å°†ä¸€ä¸ªå¯¹è±¡/表达å¼�与包å�«åœ¨ case è¯å�¥ä¸çš„å—é�¢å€¼è¿›è¡Œæ¯”较。
更强大的模å¼�匹é…�例å�å�¯ä»¥åœ¨ Scala å’Œ Elixir ç‰è¯è¨€ä¸æ‰¾åˆ°ã€‚ è¿™ç§�结构化模å¼�匹é…�æ–¹å¼�是“声明性â€�的并且会显å¼�地为所è¦�匹é…�的数æ�®æŒ‡å®šæ�¡ä»¶ï¼ˆæ¨¡å¼�)。
虽然使用嵌套的“ifâ€�è¯å�¥çš„“命令性â€�系列指令å�¯ä»¥è¢«ç”¨æ�¥å®Œæˆ�类似结构化模å¼�匹é…�的效果,但它没有“声明性â€�æ–¹å¼�é‚£æ ·æ¸…æ™°ã€‚ 相å��地,“声明性â€�æ–¹å¼�指定了一个匹é…�所è¦�满足的æ�¡ä»¶ï¼Œå¹¶ä¸”通过其显å¼�的模å¼�使之更为易读。 虽然结构化模å¼�匹é…�å�¯ä»¥é‡‡å�–将一个å�˜é‡�与一个 case è¯å�¥ä¸çš„å—é�¢å€¼è¿›è¡Œæ¯”较的最简å�•å½¢å¼�æ�¥ä½¿ç”¨ï¼Œä½†å®ƒå¯¹äºŽ Python 的真æ£ä»·å€¼åœ¨äºŽå…¶é’ˆå¯¹ç›®æ ‡ç±»åž‹å’Œå½¢çŠ¶çš„å¤„ç�†æ“�作。
简å�•模å¼�:匹é…�一个å—é�¢å€¼Â¶
让我们把这个例å�看作是模å¼�匹é…�的最简å�•å½¢å¼�:一个值,å�³ä¸»è¯�,被匹é…�åˆ°å‡ ä¸ªå—é�¢å€¼ï¼Œå�³æ¨¡å¼�。在下é�¢çš„例å�ä¸ï¼Œstatus 是匹é…�è¯å�¥çš„主è¯�。模å¼�是æ¯�个 case è¯å�¥ï¼Œå—é�¢å€¼ä»£è¡¨è¯·æ±‚状æ€�代ç �。匹é…�å�Žï¼Œå°†æ‰§è¡Œä¸Žè¯¥ case 相关的动作:
def http_error(status):
match status:
case 400:
return "Bad request"
case 404:
return "Not found"
case 418:
return "I'm a teapot"
case _:
return "Something's wrong with the internet"
å¦‚æžœä¼ ç»™ä¸Šè¿°å‡½æ•°çš„ status 为 418,则会返回 "I'm a teapot"。 å¦‚æžœä¼ ç»™ä¸Šè¿°å‡½æ•°çš„ status 为 500,则带有 _ çš„ case è¯å�¥å°†ä½œä¸ºé€šé…�符匹é…�,并会返回 "Something's wrong with the internet"。 请注æ„�最å�Žä¸€ä¸ªä»£ç �å�—:å�˜é‡�å�� _ 将作为 通é…�符 å¹¶ç¡®ä¿�ç›®æ ‡å°†æ€»æ˜¯è¢«åŒ¹é…�。 _ 的使用是å�¯é€‰çš„。
ä½ å�¯ä»¥ä½¿ç”¨ | (“ or â€�)在一个模å¼�ä¸ç»„å�ˆå‡ 个å—é�¢å€¼:
case 401 | 403 | 404:
return "Not allowed"
æ— é€šé…�符的行为¶
如果我们修改上é�¢çš„例å�,去掉最å�Žä¸€ä¸ª case å�—,这个例å�å°±å�˜æˆ�:
def http_error(status):
match status:
case 400:
return "Bad request"
case 404:
return "Not found"
case 418:
return "I'm a teapot"
如果ä¸�在 case è¯å�¥ä¸ä½¿ç”¨ _,å�¯èƒ½ä¼šå‡ºçްä¸�å˜åœ¨åŒ¹é…�的情况。如果ä¸�å˜åœ¨åŒ¹é…�,则行为是一个 no-opã€‚ä¾‹å¦‚ï¼Œå¦‚æžœä¼ å…¥äº†å€¼ä¸º 500 çš„ status ,就会å�‘生 no-op。
带有å—é�¢å€¼å’Œå�˜é‡�的模å¼�¶
模å¼�å�¯ä»¥çœ‹èµ·æ�¥åƒ�解包形å¼�,而且模å¼�å�¯ä»¥ç”¨æ�¥ç»‘定å�˜é‡�。在这个例å�ä¸ï¼Œä¸€ä¸ªæ•°æ�®ç‚¹å�¯ä»¥è¢«è§£åŒ…为它的 x å��æ ‡å’Œ y å��æ ‡:
# point is an (x, y) tuple
match point:
case (0, 0):
print("Origin")
case (0, y):
print(f"Y={y}")
case (x, 0):
print(f"X={x}")
case (x, y):
print(f"X={x}, Y={y}")
case _:
raise ValueError("Not a point")
第一个模å¼�有两个å—é�¢å€¼ (0, 0) ,å�¯ä»¥çœ‹ä½œæ˜¯ä¸Šé�¢æ‰€ç¤ºå—é�¢å€¼æ¨¡å¼�的扩展。接下æ�¥çš„两个模å¼�结å�ˆäº†ä¸€ä¸ªå—é�¢å€¼å’Œä¸€ä¸ªå�˜é‡�,而å�˜é‡� 绑定 了一个æ�¥è‡ªä¸»è¯�的值(point)。 第四ç§�模å¼�æ�•获了两个值,这使得它在概念上类似于解包赋值 (x, y) = point 。
模�和类¶
å¦‚æžœä½ ä½¿ç”¨ç±»æ�¥ç»“æž„åŒ–ä½ çš„æ•°æ�®ï¼Œä½ å�¯ä»¥ä½¿ç”¨ç±»çš„å��å—,å�Žé�¢è·Ÿä¸€ä¸ªç±»ä¼¼æž„é€ å‡½æ•°çš„å�‚数列表,作为一ç§�模å¼�。这ç§�模å¼�å�¯ä»¥å°†ç±»çš„属性æ�•æ�‰åˆ°å�˜é‡�ä¸:
class Point:
x: int
y: int
def location(point):
match point:
case Point(x=0, y=0):
print("Origin is the point's location.")
case Point(x=0, y=y):
print(f"Y={y} and the point is on the y-axis.")
case Point(x=x, y=0):
print(f"X={x} and the point is on the x-axis.")
case Point():
print("The point is located somewhere else on the plane.")
case _:
print("Not a point")
带有�置�数的模�¶
ä½ å�¯ä»¥åœ¨æŸ�些为其属性æ��供了排åº�的内置类(例如 dataclass)ä¸ä½¿ç”¨ä½�ç½®å�‚数。 ä½ ä¹Ÿå�¯ä»¥é€šè¿‡åœ¨ä½ 的类ä¸è®¾ç½® __match_args__ 特殊属性æ�¥ä¸ºæ¨¡å¼�ä¸çš„属性定义一个专门的ä½�置。 如果它被设为 ("x", "y"),则以下模å¼�å�‡ä¸ºç‰ä»·çš„(并且都是将 y 属性绑定到 var å�˜é‡�):
Point(1, var)
Point(1, y=var)
Point(x=1, y=var)
Point(y=var, x=1)
嵌套模�¶
模å¼�å�¯ä»¥ä»»æ„�地嵌套。 例如,如果我们的数æ�®æ˜¯ç”±ç‚¹ç»„æˆ�çš„çŸåˆ—表,则它å�¯ä»¥è¿™æ ·è¢«åŒ¹é…�:
match points:
case []:
print("No points in the list.")
case [Point(0, 0)]:
print("The origin is the only point in the list.")
case [Point(x, y)]:
print(f"A single point {x}, {y} is in the list.")
case [Point(0, y1), Point(0, y2)]:
print(f"Two points on the Y axis at {y1}, {y2} are in the list.")
case _:
print("Something else is found in the list.")
��模�和通�符¶
到目å‰�为æ¢ï¼Œè¿™äº›ä¾‹å�仅在最å�Žä¸€ä¸ª case è¯å�¥ä¸ä½¿ç”¨äº† _。 但通é…�符å�¯ä»¥è¢«ç”¨åœ¨æ›´å¤�æ�‚的模å¼�ä¸ï¼Œä¾‹å¦‚ ('error', code, _)。 举例æ�¥è¯´:
match test_variable:
case ('warning', code, 40):
print("A warning has been received.")
case ('error', code, _):
print(f"An error {code} occurred.")
在上述情况下,test_variable 将�匹� ('error', code, 100) 和 ('error', code, 800)。
约�项¶
我们å�¯ä»¥å�‘一个模å¼�æ·»åŠ if å�å�¥ï¼Œç§°ä¸ºâ€œçº¦æ�Ÿé¡¹â€�。 如果约æ�Ÿé¡¹ä¸ºå�‡å€¼ï¼Œåˆ™ match 将继ç»å°�试下一个 case è¯å�¥å�—。 请注æ„�值的æ�•获å�‘生在约æ�Ÿé¡¹è¢«æ±‚值之å‰�。:
match point:
case Point(x, y) if x == y:
print(f"The point is located on the diagonal Y=X at {x}.")
case Point(x, y):
print(f"Point is not on the diagonal.")
其他关键特性¶
一些其他关键特性:
类似于解包赋值,元组和列表模å¼�具有完全相å�Œçš„å�«ä¹‰ï¼Œè€Œä¸”实际上能匹é…�ä»»æ„�åº�列。 ä»ŽæŠ€æœ¯ä¸Šè¯´ï¼Œç›®æ ‡å¿…é¡»ä¸ºä¸€ä¸ªåº�列。 å› è€Œï¼Œä¸€ä¸ªé‡�è¦�的例外是模å¼�ä¸�能匹é…�è¿ä»£å™¨ã€‚ 而且,为了é�¿å…�一个常è§�的错误,åº�列模å¼�ä¸�能匹é…�å—符串。
�列模�支�通�符:
[x, y, *rest]å’Œ(x, y, *rest)的作用类似于解包赋值ä¸çš„通é…�符。 在*之å�Žçš„å��称也å�¯ä»¥ä¸º_ï¼Œå› æ¤(x, y, *_)å�¯ä»¥åŒ¹é…�包å�«ä¸¤ä¸ªæ�¡ç›®çš„åº�列而ä¸�必绑定其余的æ�¡ç›®ã€‚æ˜ å°„æ¨¡å¼�:
{"bandwidth": b, "latency": l}会从一个å—兏䏿�•获"bandwidth"å’Œ"latency"值。 与åº�列模å¼�ä¸�å�Œï¼Œé¢�外的键会被忽略。 也支æŒ�通é…�符**rest。 (但**_æ˜¯å†—ä½™çš„ï¼Œå› è€Œä¸�被å…�许。)å�模å¼�å�¯ä½¿ç”¨
as关键嗿�¥æ�•获:case (Point(x1, y1), Point(x2, y2) as p2): ...
x1, y1, x2, y2 ç‰ç»‘å®šå°±å¦‚ä½ åœ¨æ²¡æœ‰
aså�å�¥çš„æƒ…况下所期望的,而 p2 ä¼šç»‘å®šç›®æ ‡çš„æ•´ä¸ªç¬¬äºŒé¡¹ã€‚å¤§å¤šæ•°å—é�¢å€¼æ˜¯æŒ‰ç›¸ç‰æ€§æ¯”较的。 但是,å�•例对象
True,Falseå’ŒNoneåˆ™æ˜¯æŒ‰æ ‡è¯†å�·æ¯”较的。命å��常é‡�也å�¯ä»¥åœ¨æ¨¡å¼�ä¸ä½¿ç”¨ã€‚ 这些命å��常é‡�必须为带点å�·çš„å��称以防æ¢å¸¸é‡�被解读为æ�•获å�˜é‡�:
from enum import Enum class Color(Enum): RED = 0 GREEN = 1 BLUE = 2 color = Color.GREEN match color: case Color.RED: print("I see red!") case Color.GREEN: print("Grass is green") case Color.BLUE: print("I'm feeling the blues :(")
å®Œæ•´è§„æ ¼è¯´æ˜Žå�‚è§� PEP 634。 动机与ç�†ç”±å�‚è§� PEP 635,更详细的教程å�‚è§� PEP 636。
�选的 EncodingWarning 和 encoding="locale" 选项¶
TextIOWrapper å’Œ open() 的默认编ç �æ ¼å¼�å�–决于具体的平å�°å’Œè¯è¨€åŒºåŸŸè®¾ç½®ã€‚ 由于 UTF-8 被用于大多数 Unix å¹³å�°ï¼Œå½“打开 UTF-8 文件 (例如 JSON, YAML, TOML, Markdown) æ—¶çœ�ç•¥ encoding 选项是一个é�žå¸¸å¸¸è§�的错误。 例如:
# BUG: "rb" mode or encoding="utf-8" should be used.
with open("data.json") as f:
data = json.load(f)
为了便于查找æ¤ç±»é”™è¯¯ï¼Œå¢žåŠ äº†å�¯é€‰çš„ EncodingWarning。 它会在 sys.flags.warn_default_encoding 为真值并使用了è¯è¨€åŒºåŸŸæŒ‡å®šçš„默认编ç �æ ¼å¼�时被å�‘出。
å¢žåŠ äº† -X warn_default_encoding 选项和 PYTHONWARNDEFAULTENCODING æ�¥å�¯ç”¨ç›¸åº”è¦å‘Šã€‚
请å�‚阅 文本编ç �æ ¼å¼� 了解更多信æ�¯ã€‚
å…¶ä»–è¯è¨€ç‰¹æ€§ä¿®æ”¹Â¶
int类型新增了一个方法int.bit_count(),返回给定整数的二进制展开ä¸å€¼ä¸ºä¸€çš„ä½�数,或称“比特计é‡�â€�。 (由 Niklas Fiekas 在 bpo-29882 ä¸è´¡çŒ®ã€‚)现在
dict.keys(),dict.values()å’Œdict.items()所返回的视图都有一个mapping属性,它给出包装了原始å—典的types.MappingProxyType对象。 (由 Dennis Sweeney 在 bpo-40890 ä¸è´¡çŒ®ã€‚)PEP 618: 现在
zip()函数有一个å�¯é€‰çš„strictæ——æ ‡ï¼Œç”¨äºŽè¦�求所有å�¯è¿ä»£å¯¹è±¡çš„长度都相ç‰ã€‚接å�—æ•´æ•°å�‚数的内置和扩展函数ä¸�å†�接å�—
Decimal,Fraction以å�Šå…¶ä»–å�¯è¢«è½¬æ�¢ä¸ºæ•´æ•°ä½†ä¼šä¸¢å¤±ç²¾åº¦ï¼ˆå�³å…·æœ‰__int__()方法但没有__index__()方法)的对象。 (由 Serhiy Storchaka 在 bpo-37999 ä¸è´¡çŒ®ã€‚)如果
object.__ipow__()返回NotImplemented,该è¿�算符将æ£ç¡®åœ°æŒ‰ç…§é¢„期回退至object.__pow__()å’Œobject.__rpow__()。 (由 Alex Shkop 在 bpo-38302 ä¸è´¡çŒ®ã€‚)现在赋值表达å¼�å�¯ä»¥ä¸�带圆括å�·åœ°åœ¨é›†å�ˆå—é�¢å€¼å’Œé›†å�ˆæŽ¨å¯¼å¼�ä¸ä½¿ç”¨ï¼Œä¹Ÿå�¯ä»¥åœ¨åº�列索引å�·ä¸ä½¿ç”¨ï¼ˆä½†ä¸�能用于切片)。
函数具有一个新的
__builtins__属性,当函数被执行时它会被用于查找内置符å�·ï¼Œè€Œä¸�是在__globals__['__builtins__']䏿Ÿ¥æ‰¾ã€‚ 如果__globals__["__builtins__"]å˜åœ¨åˆ™è¯¥å±žæ€§å°†åŸºäºŽå®ƒæ�¥åˆ�始化,å�¦åˆ™å°†åŸºäºŽå½“å‰�的内置函数。 (由 Mark Shannon 在 bpo-42990 ä¸è´¡çŒ®ã€‚ï¼‰å¢žåŠ äº†ä¸¤ä¸ªæ–°çš„å†…ç½®å‡½æ•° ——
aiter()å’Œanext()以分别æ��供与iter()å’Œnext()对应的异æ¥ç‰ˆæœ¬ã€‚ (由 Joshua Bronson, Daniel Pope å’Œ Justin Wang 在 bpo-31861 ä¸è´¡çŒ®ã€‚)é�™æ€�方法 (
@staticmethod) 和类方法 (@classmethod) 现在会继承方法属性 (__module__,__name__,__qualname__,__doc__,__annotations__) 并具有一个新的__wrapped__属性。 æ¤å¤–,é�™æ€�æ–¹æ³•çŽ°åœ¨è¿˜æ˜¯ä¸Žå¸¸è§„å‡½æ•°ä¸€æ ·çš„å�¯è°ƒç”¨å¯¹è±¡ã€‚ (由 Victor Stinner 在 bpo-43682 ä¸è´¡çŒ®ã€‚)å¤�æ�‚ç›®æ ‡çš„æ³¨è§£ï¼ˆ PEP 526 定义的除
simple name之外的一切å¤�æ�‚ç›®æ ‡ï¼‰åœ¨è¿�行时ä¸�å†�å�—from __future__ import annotations的影å“�。(由Batuhan Taskaya 在 bpo-42737 ä¸è´¡çŒ®ï¼‰ã€‚类和模å�—对象现在å�¯ä»¥æŒ‰éœ€åˆ›å»ºç©ºçš„æ³¨è§£å—典。为ä¿�è¯�å�‘下兼容,这些注解数æ�®å°†å˜å‚¨äºŽå¯¹è±¡çš„
__dict__ä¸ã€‚这改进了__annotations__的最佳用法;更多信æ�¯è¯·å�‚阅 对象注解属性的最佳实践 。(由 Larry Hastings 在 bpo-43901 ä¸è´¡çŒ®ï¼‰ç”±äºŽä¼šäº§ç”Ÿå‰¯ä½œç”¨ï¼ŒçŽ°åœ¨
from __future__ import annotationsæ—¶ç¦�æ¢ä½¿ç”¨åŒ…å�«yieldã€�yield fromã€�await或已命å��表达å¼�的注解。(由 Batuhan Taskaya 在 bpo-42725 ä¸è´¡çŒ®ï¼‰æœªç»‘定å�˜é‡�ã€�
super()和其他å�¯èƒ½æ”¹å�˜ç¬¦å�·è¡¨å¤„ç�†çš„表达å¼�,现在在from __future__ import annotationsæ—¶ä¸�能用作注解。(由 Batuhan Taskaya 在 bpo-42725 ä¸è´¡çŒ®ï¼‰float类型和decimal.Decimal类型的 NaN 值的哈希值现在å�–决于对象身份。以å‰�,å�³ä¾¿ NaN 值彼æ¤ä¸�ç‰ï¼Œä¹Ÿéƒ½æ˜¯å“ˆå¸Œä¸º0。在创建包å�«å¤šä¸ª NaN çš„å—典和集å�ˆæ—¶ï¼Œç”±äºŽå“ˆå¸Œå†²çª�过度,导致了è¿�行代价å�¯èƒ½ä¼šäºŒæ¬¡æ–¹å¢žé•¿ã€‚(由 Raymond Hettinger 在 bpo-43475 ä¸è´¡çŒ®ï¼‰å½“åˆ é™¤
__debug__常é‡�时将引å�‘SyntaxError(而ä¸�是NameError)。 (由 Donghee Na 在 bpo-45000 ä¸è´¡çŒ®ã€‚)SyntaxError异常现在有end_linenoå’Œend_offset属性。 如果ä¸�确定的è¯�,它们将是None。(ç”± Pablo Galindo 在 bpo-43914 ä¸è´¡çŒ®ã€‚)
新增模�¶
æ— ã€‚
改进的模�¶
asyncio¶
åŠ å…¥äº†ç¼ºå¤±çš„ connect_accepted_socket() 方法。(由 Alex Grönholm 在 bpo-41332 ä¸è´¡çŒ®ï¼‰
argparse¶
在 argparse 的帮助ä¸ï¼Œå°†â€œå�¯é€‰å�‚æ•°â€�这一误导性çŸè¯æ”¹ä¸ºâ€œå�¯é€‰é¡¹â€�。æŸ�些测试代ç �如果ä¾�赖精确的输出匹é…�,å�¯èƒ½éœ€è¦�调整。(由 Raymond Hettinger 在 bpo-9694 ä¸è´¡çŒ®ï¼‰
array¶
现在, array.array çš„ index() 方法拥有å�¯é€‰çš„ start å’Œ stop å�‚数。(由 Anders Lorentsen å’Œ Zackery Spytz 在 bpo-31956 ä¸è´¡çŒ®ï¼‰
asynchat�asyncore 和 smtpd¶
从 Python 3.6 开始,这些模å�—在其文档ä¸å·²è¢«æ ‡ä¸ºåºŸå¼ƒã€‚现在这三个模å�—éƒ½å¢žåŠ äº†ä¸€ä¸ªå¯¼å…¥æ—¶è¦å‘Š DeprecationWarning。
base64¶
å¢žåŠ base64.b32hexencode() å’Œ base64.b32hexdecode() 以支æŒ�带有扩展å��å…è¿›åˆ¶å—æ¯�çš„ Base32 ç¼–ç �。
bdb¶
å¢žåŠ clearBreakpoints() ,用于é‡�置所有已设æ–点。(由 Irit Katriel 在 bpo-24160 ä¸è´¡çŒ®ï¼‰
bisect¶
å¢žåŠ äº†ä¸º bisect 模å�—ä¸çš„ API æ��ä¾› key 函数的å�¯èƒ½æ€§ã€‚(ç”± Raymond Hettinger 在 bpo-4356 ä¸è´¡çŒ®ã€‚)
ç¼–ç �器¶
å¢žåŠ ä¸€ä¸ª codecs.unregister() 函数,用于å�–消对编解ç �器æ�œç´¢å‡½æ•°çš„æ³¨å†Œã€‚(由 Hai Shi 在 bpo-41842 ä¸è´¡çŒ®ï¼‰
collections.abc¶
现在, parameterized generic çš„ collections.abc.Callable çš„ __args__ 与 typing.Callable 一致了。 collections.abc.Callable generic 现在将类型å�‚æ•°æ‰�平化了,类似于 typing.Callable 当å‰�çš„å�šæ³•ã€‚è¿™æ„�味ç�€ collections.abc.Callable[[int, str], str] 将带有 (int, str, str) çš„å�‚æ•° __args__;以å‰�是 ([int, str], str) 。为了å�šåˆ°è¿™ä¸€å�˜åŒ–, types.GenericAlias 现在å�¯ä»¥è¢«å�类化,当对 collections.abc.Callable ç±»åž‹è¿›è¡Œä¸‹æ ‡è®¿é—®æ—¶ï¼Œå°†è¿”å›žä¸€ä¸ªå�类。注æ„�,collections.abc.Callable é�žæ³•çš„å�‚数化形å¼�å�¯èƒ½ä¼šè§¦å�‘ TypeError ,而在 Python 3.9 ä¸å�¯èƒ½å°±é�™é»˜äº†ã€‚(由 Ken Jin 在 bpo-42195 ä¸è´¡çŒ®ï¼‰
contextlib¶
å¢žåŠ äº†ä¸€ä¸ªä¸Šä¸‹æ–‡ç®¡ç�†å™¨ contextlib.aclosing() ,以便能安全关é—异æ¥ç”Ÿæˆ�器和代表异æ¥é‡Šæ”¾èµ„æº�的对象。(由 Joongi Kim å’Œ John Belmonte 在 bpo-41229 ä¸è´¡çŒ®ï¼‰
为 contextlib.nullcontext() åŠ å…¥å¼‚æ¥ä¸Šä¸‹æ–‡ç®¡ç�†å™¨æ”¯æŒ�。由 Tom Gringauz 在 bpo-41543 ä¸è´¡çŒ®ï¼‰
åŠ å…¥ AsyncContextDecorator,以便支æŒ�用异æ¥ä¸Šä¸‹æ–‡ç®¡ç�†å™¨ä½œä¸ºè£…饰器。
curses¶
在 ncurses 6.1 ä¸å¢žåŠ çš„æ‰©å±•é¢œè‰²å‡½æ•°å°†ä¼šç”± curses.color_content() ã€� curses.init_color() ã€� curses.init_pair() å’Œ curses.pair_content() é€�明地使用。新增的函数 curses.has_extended_color_support() 将指明下层的 ncurses 库是å�¦æ��供了扩展颜色支æŒ�。(由 Jeffrey Kintscher å’Œ Hans Petter Jansson 在 bpo-36982 ä¸è´¡çŒ®ï¼‰
现在常é‡� BUTTON5_* 如果是由底层的 curses 库æ��供的,则会在 curses 模å�—ä¸ä½“现。(由 Zackery Spytz 在 bpo-39273 ä¸è´¡çŒ®ï¼‰
dataclasses¶
__slots__¶
在 dataclasses.dataclass() è£…é¥°å™¨ä¸æ·»åŠ slots å�‚数。(ç”± Yurii Karabas 在 bpo-42269 ä¸è´¡çŒ®)
ä»…é™�关键å—å—æ®µÂ¶
æ•°æ�®ç±»çŽ°åœ¨æ”¯æŒ�在生æˆ�çš„ __init__ 方法ä¸å�ªç”¨å…³é”®å—çš„å—æ®µã€‚ 有许多方法å�¯ä»¥æŒ‡å®šå�ªç”¨å…³é”®å—çš„å—æ®µã€‚
ä½ å�¯ä»¥è¯´æ¯�ä¸€ä¸ªå—æ®µéƒ½æ˜¯ä»…é™�关键å—çš„:
from dataclasses import dataclass
@dataclass(kw_only=True)
class Birthday:
name: str
birthday: datetime.date
name å’Œ birthday 都是生æˆ�çš„ __init__ 方法的仅é™�关键å—çš„å�‚数。
ä½ å�¯ä»¥åœ¨æ¯�ä¸ªå—æ®µçš„基础上指定仅é™�关键å—:
from dataclasses import dataclass, field
@dataclass
class Birthday:
name: str
birthday: datetime.date = field(kw_only=True)
这里的å�ªæœ‰ birthday 是仅é™�关键å—ã€‚å¦‚æžœä½ åœ¨å�•ä¸ªå—æ®µä¸Šè®¾ç½® kw_only ,è¦�注æ„�由于仅é™�关键å—çš„å—æ®µéœ€è¦�跟在é�žä»…é™�关键å—çš„å—æ®µå�Žé�¢ï¼Œæ‰€ä»¥æœ‰å…³äºŽé‡�新排åº�的规则。 详情请看完整的数æ�®ç±»æ–‡ä»¶ã€‚
ä½ ä¹Ÿå�¯ä»¥æŒ‡å®š KW_ONLY æ ‡è®°å�Žé�¢çš„æ‰€æœ‰å—段都是仅é™�关键å—的。 è¿™å�¯èƒ½æ˜¯æœ€å¸¸è§�的用法:
from dataclasses import dataclass, KW_ONLY
@dataclass
class Point:
x: float
y: float
_: KW_ONLY
z: float = 0.0
t: float = 0.0
在这里,z å’Œ t 是仅é™�关键å—å½¢å�‚,而 x å’Œ y ä¸�是。 (由 Eric V. Smith 在 bpo-43532 ä¸è´¡çŒ®ã€‚)
distutils¶
整个 distutils 包已被废弃,将在 Python 3.12 ä¸ç§»é™¤ã€‚其用指定包构建程åº�的功能已被第三方软件包 setuptools å’Œ packaging 完全å�–代,而且大多数其他常用的 API åœ¨æ ‡å‡†åº“çš„å…¶ä»–åœ°æ–¹éƒ½å�¯ä»¥è°ƒç”¨ï¼ˆå¦‚ platform ã€� shutil ã€� subprocess 或 sysconfig)。目å‰�没有è¿�ç§» distutils 其他功能的计划,用到其他功能的应用程åº�应该准备好自己ä¿�留一份拷è´�。请å�‚考 PEP 632 。
在 Python 3.8 ä¸åºŸå¼ƒçš„ bdist_wininst 命令已被移除。现在在 Windows ä¸å�‘布二进制包推è��采用 bdist_wheel 命令。(由 Victor Stinner 在 bpo-42802 ä¸è´¡çŒ®ï¼‰
doctest¶
若模å�—䏿²¡æœ‰å®šä¹‰ __loader__ ,则回退至使用 __spec__.loader 。(由 Brett Cannon 在 bpo-42133 ä¸è´¡çŒ®ï¼‰
encodings¶
现在 encodings.normalize_encoding() 会忽略é�ž ASCII å—符。(由 Hai Shi 在 bpo-39337 ä¸è´¡çŒ®ï¼‰
enum¶
Enum __repr__() 现在返回 enum_name.member_name 而 __str__() 现在返回 member_name。 作为模å�—常é‡�æ��ä¾›çš„æ ‡å‡†åº“æžšä¸¾çš„ repr() 为 module_name.member_name。 (由 Ethan Furman 在 bpo-40066 ä¸è´¡çŒ®ã€‚)
å¢žåŠ enum.StrEnum 用于所有æˆ�员å�‡ä¸ºå—符串的枚举。 (由 Ethan Furman 在 bpo-41816 ä¸è´¡çŒ®ã€‚)
fileinput¶
在 fileinput.input() å’Œ fileinput.FileInput ä¸å¢žåŠ äº† encoding å’Œ errors å½¢å�‚。 (由 Inada Naoki 在 bpo-43712 ä¸è´¡çŒ®ã€‚)
现在 fileinput.hook_compressed() 会在 mode 为 "r" 且文件被压缩时返回 TextIOWrapper,与未压缩文件一致。 (由 Inada Naoki 在 bpo-5758 ä¸è´¡çŒ®ã€‚)
faulthandler¶
现在 faulthandler 模å�—会检测在垃圾回收期间是å�¦å�‘生严é‡�错误。 (由 Victor Stinner 在 bpo-44466 ä¸è´¡çŒ®ï¼‰
gc¶
为 gc.get_objects(), gc.get_referrers() å’Œ gc.get_referents() æ·»åŠ äº†å®¡è®¡é’©å�。 (由 Pablo Galindo 在 bpo-43439 ä¸è´¡çŒ®ã€‚)
glob¶
在 glob() å’Œ iglob() ä¸å¢žåŠ äº† root_dir å’Œ dir_fd å½¢å�‚,用于指定æ�œç´¢çš„æ ¹ç›®å½•。(由 Serhiy Storchaka 在 bpo-38144 ä¸è´¡çŒ®ï¼‰
hashlib¶
hashlib 模å�—è¦�求 OpenSSL 1.1.1 或更新版本。 (由 Christian Heimes 在 PEP 644 å’Œ bpo-43669 ä¸è´¡çŒ®ã€‚)
hashlib 模å�—å·²åˆ�æ¥æ”¯æŒ� OpenSSL 3.0.0。 (由 Christian Heimes 在 bpo-38820 å�Šå…¶ä»–问题事项ä¸è´¡çŒ®ã€‚)
纯 Python 的回退版 pbkdf2_hmac() 已被弃用。 未æ�¥ PBKDF2-HMAC 将仅在 Python 带有 OpenSSL 编译时æ‰�å�¯ç”¨ã€‚(由 Christian Heimes 在 bpo-43880 ä¸è´¡çŒ®ï¼‰
hmac¶
现在 hmac 模å�—会在内部使用 OpenSSL çš„ HMAC 实现。 (由 Christian Heimes 在 bpo-40645 ä¸è´¡çŒ®ã€‚)
IDLE 与 idlelib¶
使 IDLE 调用 sys.excepthook() (当å�¯åŠ¨æ—¶æ²¡æœ‰ '-n' )。用户钩å�以å‰�是被忽略的。 (ç”± Ken Hilton 在 bpo-43008 ä¸è´¡çŒ®ã€‚)
é‡�新安排设置对è¯�框。 将常规选项å�¡åˆ†æˆ� Windows å’Œ Shell/Ed 选项å�¡ã€‚ 将扩展帮助è�œå�•的帮助æº�ç§»è‡³æ‰©å±•æ ‡ç¾ã€‚为新选项留出空间,并缩çŸå¯¹è¯�框。å�Žè€…使对è¯�框更适å�ˆå°�å±�幕。 (ç”± Terry Jan Reedy 贡献于 bpo-40468 。) 将缩进空间设置从å—ä½“æ ‡ç¾ç§»åˆ°æ–°çš„ Windows æ ‡ç¾ã€‚ (ç”± Mark Roseman å’Œ Terry Jan Reedy 在 bpo-33962 䏿��ä¾›)。
上述å�˜åŒ–已被å��å�‘ç§»æ¤�到 3.9 维护版本ä¸ã€‚
å¢žåŠ äº† Shell ä¾§æ �。 将主æ��示符(“>>>â€�)移至侧æ �。二级æ��示符(“...â€�ï¼‰ä¹ŸåŠ å…¥ä¾§æ �。在编辑器的行å�·ä¾§æ �ä¸Šé¼ æ ‡å�•击和å�¯é€‰çš„æ‹–动,会选定一行或多行文本。在选定文本行å�Žå�³å‡»å°†æ˜¾ç¤ºåŒ…å�«â€œcopy with promptsâ€�的上下文è�œå�•。这会将侧æ �çš„æ��示符与选定文本行å�ˆå¹¶ã€‚该选项也会在文本的上下文è�œå�•䏿˜¾ç¤ºã€‚(由 Tal Einat 在 bpo-37903 ä¸è´¡çŒ®ï¼‰
ä½¿ç”¨ç©ºæ ¼è€Œä¸�是制表符æ�¥ç¼©è¿›äº¤äº’å¼�代ç �。 这使得交互å¼�代ç �æ�¡ç›® "看起æ�¥å¾ˆæ£ç¡®"。 使之å�¯è¡Œæ˜¯å¢žåŠ shell ä¾§è¾¹æ �的一个主è¦�动机。 (ç”± Terry Jan Reedy 在 bpo-37892 ä¸è´¡çŒ®ã€‚)
在模å¼�匹é…�è¯å�¥ä¸é«˜äº®æ˜¾ç¤ºæ–°çš„ è½¯å…³é”®å— match ã€� case å’Œ _。 但这ç§�高亮显示并ä¸�完美,æŸ�些æž�端情况下还会出现错误,包括 case 模å¼�ä¸çš„一些 _。 (由 Tal Einat 在 bpo-44010 ä¸è´¡çŒ®ã€‚)
3.10 维护版本ä¸çš„æ–°å†…容。
对 .pyi æ–‡ä»¶åº”ç”¨è¯æ³•高亮。 (由 Alex Waygood å’Œ Terry Jan Reedy 在 bpo-45447 ä¸è´¡çŒ®ã€‚)
当附带输入和输出地ä¿�å˜ Shell 时将包括æ��示符。 (由 Terry Jan Reedy 在 gh-95191 ä¸è´¡çŒ®ã€‚)
importlib.metadata¶
与 importlib_metadata 4.6(history)的功能一致。
现在 importlib.metadata entry points 通过一个新的 importlib.metadata.EntryPoints 类,为由组和å��称选择入å�£ç‚¹æ��供了更好的体验。关于废弃之处和用法的更多信æ�¯ï¼Œè¯·å�‚è§�文档ä¸çš„兼容性说明。
æ·»åŠ äº† importlib.metadata.packages_distributions(),用于将顶级 Python 模å�—和包解æž�为其 importlib.metadata.Distributions。
inspect¶
若模å�—䏿²¡æœ‰å®šä¹‰ __loader__ ,则回退至使用 __spec__.loader 。(由 Brett Cannon 在 bpo-42133 ä¸è´¡çŒ®ï¼‰
åŠ å…¥äº† inspect.get_annotations(),以便安全地对对象ä¸å®šä¹‰çš„æ³¨è§£è¿›è¡Œæ±‚值。inspect.get_annotations() 也å�¯ä»¥æ£ç¡®åœ°è§£æž�å—符串化的注解。 inspect.get_annotations() 现在应是访问任何 Python 对象注解å—典的最佳实践;关于注解最佳用法的更多信æ�¯ï¼Œè¯·å�‚è§� 对象注解属性的最佳实践。与之关è�”的, inspect.signature() ã€� inspect.Signature.from_callable() å’Œ inspect.Signature.from_function() 现在也调用 inspect.get_annotations() æ�¥èŽ·å�–注解信æ�¯ã€‚è¿™æ„�味ç�€ inspect.signature() å’Œ inspect.Signature.from_callable() 现在也å�¯ä»¥è§£æž�å—符串化的注解了。(由 Larry Hastings 在 bpo-43817 ä¸è´¡çŒ®ï¼‰
itertools¶
æ·»åŠ äº† itertools.pairwise() (由 Raymond Hettinger 在 bpo-38200 ä¸è´¡çŒ®ã€‚)
linecache¶
若模å�—䏿²¡æœ‰å®šä¹‰ __loader__ ,则回退至使用 __spec__.loader 。(由 Brett Cannon 在 bpo-42133 ä¸è´¡çŒ®ï¼‰
os¶
为 VxWorks 实时æ“�ä½œç³»ç»ŸåŠ å…¥ os.cpu_count() 的支æŒ�。(由 Peixing Xin 在 bpo-41440 ä¸è´¡çŒ®ï¼‰
åŠ å…¥ä¸€ä¸ªæ–°å‡½æ•° os.eventfd() å�Šå…¶åŠ©æ‰‹å‡½æ•°ï¼Œä»¥å°�装 Linux 的系统调用 eventfd2 。(ç”± Christian Heimes 在 bpo-41001 ä¸è´¡çŒ®ï¼‰
åŠ å…¥ os.splice(),以便在两个文件æ��述符之间移动数æ�®ï¼Œè€Œæ— éœ€åœ¨å†…æ ¸åœ°å�€ç©ºé—´å’Œç”¨æˆ·åœ°å�€ç©ºé—´ä¹‹é—´è¿›è¡Œå¤�制,其ä¸ä¸€ä¸ªæ–‡ä»¶æ��述符必须指å�‘æŸ�个管é�“。(由 Pablo Galindo 在 bpo-41625 ä¸è´¡çŒ®ï¼‰
为 macOS å¢žåŠ äº† O_EVTONLY, O_FSYNC, O_SYMLINK å’Œ O_NOFOLLOW_ANY。 (由 Donghee Na 在 bpo-43106 ä¸è´¡çŒ®ã€‚)
os.path¶
现在 os.path.realpath() å�¯æŽ¥å�—一个关键å—å�‚æ•° strict。 若设为 True ,则在路径ä¸�å˜åœ¨æˆ–é�é�‡å¾ªçŽ¯ç¬¦å�·é“¾æŽ¥æ—¶ï¼Œä¼šè§¦å�‘ OSError。 (由 Barney Gale 在 bpo-43757 ä¸è´¡çŒ®ã€‚)
pathlib¶
为 PurePath.parents å¢žåŠ åˆ‡ç‰‡æ”¯æŒ�。 (由 Joshua Cannon 在 bpo-35498 ä¸è´¡çŒ®ã€‚)
为 PurePath.parents å¢žåŠ è´Ÿåº�列å�·æ”¯æŒ�。 (由 Yaroslav Pankovych 在 bpo-21041 ä¸è´¡çŒ®ã€‚)
å¢žåŠ äº† Path.hardlink_to 方法æ�¥å�–代 link_to()。 这个新方法的å�‚数顺åº�与 symlink_to() 的相å�Œã€‚ (由 Barney Gale 在 bpo-39950 ä¸è´¡çŒ®ã€‚)
现在 pathlib.Path.stat() å’Œ chmod() 接å�—一个关键å—å�‚æ•° follow_symlinks ,以便与 os 模å�—ä¸çš„对应函数ä¿�æŒ�一致。(由 Barney Gale 贡献于 bpo-39906 )
平�¶
对从 freedesktop.org os-release æ ‡å‡†æ–‡ä»¶æ��å�–æ“�ä½œç³»ç»Ÿæ ‡è¯†å¢žåŠ platform.freedesktop_os_release()。 (由 Christian Heimes 在 bpo-28468 ä¸è´¡çŒ®ã€‚)
pprint¶
现在 pprint.pprint() 接å�—一个新的关键å—å�‚æ•° underscore_numbers。(由 sblondon 贡献于 bpo-42914 )
现在 pprint �以完美打� dataclasses.dataclass 实例。(由 Lewis Gaul 贡献于 bpo-43080 )
py_compile¶
py_compile' 的命令行界é�¢åŠ å…¥ `--quiet`` 选项。(由 Gregory Schevchenko 贡献于 bpo-38731 )
pyclbr¶
在 pyclbr.readmodule() å’Œ pyclbr.readmodule_ex() è¿”å›žçš„ç»“æžœæ ‘ä¸çš„ Function å’Œ Class å¯¹è±¡ä¸Šæ·»åŠ ä¸€ä¸ª end_lineno 属性。 它将匹é…�现有的 (èµ·å§‹) lineno。 (由 Aviral Srivastava 在 bpo-38307 ä¸è´¡çŒ®ã€‚)
shelve¶
现在 shelve 在创建 shelve 时默认使用 pickle.DEFAULT_PROTOCOL 而ä¸�是 pickle å��è®® 3。 (由 Zackery Spytz 在 bpo-34204 ä¸è´¡çŒ®ã€‚)
statistics¶
åŠ å…¥ covariance() ã€�Pearson çš„ correlation() 和简å�•çš„ linear_regression() 函数。(由 Tymoteusz WoÅ‚odźko 贡献于 bpo-38490 )
site¶
若模å�—䏿²¡æœ‰å®šä¹‰ __loader__ ,则回退至使用 __spec__.loader 。(由 Brett Cannon 在 bpo-42133 ä¸è´¡çŒ®ï¼‰
socket¶
现在异常 socket.timeout 是 TimeoutError 的别å��。(由 Christian Heimes 在 bpo-42413 ä¸è´¡çŒ®ã€‚)
åŠ å…¥ç”¨ IPPROTO_MPTCP 创建 MPTCP 套接å—的选项(由 Rui Cunha 贡献于 bpo-43571 )
åŠ å…¥ IP_RECVTOS 选项,以便接收æœ�务类型(ToS)或 DSCP/ECN å—æ®µï¼ˆç”± Georg Sauthoff 贡献于 bpo-44077 )
ssl¶
ssl 模å�—è¦�求 OpenSSL 1.1.1 或更新版本。 (由 Christian Heimes 在 PEP 644 å’Œ bpo-43669 ä¸è´¡çŒ®ã€‚)
ssl 模å�—å·²åˆ�æ¥æ”¯æŒ� OpenSSL 3.0.0 和新选项 OP_IGNORE_UNEXPECTED_EOF。 (由 Christian Heimes 在 bpo-38820, bpo-43794, bpo-43788, bpo-43791, bpo-43799, bpo-43920, bpo-43789 å’Œ bpo-43811 ä¸è´¡çŒ®ã€‚)
现在,已弃用函数和使用已弃用常é‡�会导致 DeprecationWarning。 ssl.SSLContext.options 默认设置了 OP_NO_SSLv2 å’Œ OP_NO_SSLv3 ï¼Œå› è€Œè®¾ç½®æ¤æ ‡è®°æ— 法å†�次å�‘出è¦å‘Šäº†ã€‚ 弃用部分 列出了已弃用的特性。 (由 Christian Heimes 贡献于 bpo-43880 )
现在,ssl 模å�—默认设置的安全性æ��高了。默认情况下,ä¸�具备å‰�å�‘安全性或 SHA-1 MAC çš„åŠ å¯†ç®—æ³•ä¼šè¢«ç¦�用。二级安全ç¦�æ¢å®‰å…¨æ€§ä½ŽäºŽ 112 ä½�的弱 RSAã€�DH å’Œ ECC 密钥。 SSLContext 默认的最低版本å��议为 TLS 1.2。这些设置是基于 Hynek Schlawack çš„ç ”ç©¶ã€‚ï¼ˆç”± Christian Heimes 贡献于 bpo-43998 )
已弃用的å��è®® SSL 3.0, TLS 1.0 å’Œ TLS 1.1 ä¸�å†�å�—到官方支æŒ�。Python ä¸�会直接ç¦�用。但 OpenSSL 编译选项ã€�å�‘行版é…�ç½®ã€�厂商补ä¸�å’ŒåŠ å¯†å¥—ä»¶å�¯èƒ½ä¼šé˜»æ¢æ�¡æ‰‹æˆ�功。
为 ssl.get_server_certificate() å‡½æ•°åŠ å…¥ timeout å½¢å�‚。(由 Zackery Spytz 贡献于 bpo-31870 )
ssl 模å�—ç”¨åˆ°äº†å †ç±»åž‹å’Œå¤šé˜¶æ®µåˆ�始化。(由 Christian Heimes 贡献于 bpo-42333 )
å¢žåŠ äº†ä¸€ä¸ªæ–°çš„æ ¡éªŒæ——æ ‡ VERIFY_X509_PARTIAL_CHAIN。 (由 l0x 在 bpo-40849 ä¸è´¡çŒ®ã€‚)
sqlite3¶
为 connect/handle() ã€� enable_load_extension() å’Œ load_extension() åŠ å…¥å®¡è®¡äº‹ä»¶ã€‚ï¼ˆç”± Erlend E. Aasland 贡献于 bpo-43762)
sys¶
åŠ å…¥äº† sys.orig_argv å±žæ€§ï¼šä¼ ç»™ Python å�¯æ‰§è¡Œæ–‡ä»¶çš„åˆ�始命令行å�‚数列表。(由 Victor Stinner 贡献于 bpo-23427 )
æ·»åŠ äº† sys.stdlib_module_names,包å�«æ ‡å‡†åº“模å�—å��称的列表。 (由 Victor Stinner 在 bpo-42955 ä¸è´¡çŒ®ã€‚)
_thread¶
现在 _thread.interrupt_main() 接å�—一个å�¯é€‰çš„ä¿¡å�·æ•°å€¼ä¾›æ¨¡æ‹Ÿ (默认值ä»�为 signal.SIGINT)。 (由 Antoine Pitrou 在 bpo-43356 ä¸è´¡çŒ®ã€‚)
threading¶
åŠ å…¥ threading.gettrace() å’Œ threading.getprofile() ,分别用于获å�– threading.settrace() å’Œ threading.setprofile() 设置的函数。(由Mario Corchero 贡献于 bpo-42251 )
åŠ å…¥ threading.__excepthook__ ,用于获å�– threading.excepthook() çš„åˆ�始值,以防被设为一个差劲或其他的值。(由 Mario Corchero 贡献于 bpo-42308 )
traceback¶
现在,format_exception() � format_exception_only() 和 print_exception() 函数�以接�一个异常对象,作为唯一的�置�数。(由 Zackery Spytz 和 Matthias Bussonnier 贡献于 bpo-26389)
types¶
�新引入 types.EllipsisType � types.NoneType 和 types.NotImplementedType 类,以�供一套新的类型,�供类型检查程�解释。(由 Bas van Beek 贡献于 bpo-41810)
typing¶
主�的�化�阅 有关类型�示的新增特性 。
typing.Literal 的行为被改为�循 PEP 586 并匹�该 PEP 所�述的��类型检查器的行为。
Literal现在将是去é‡�å�Žçš„å½¢å�‚。Literalå¯¹è±¡çš„ç›¸ç‰æ€§æ¯”较现在将与顺åº�æ— å…³ã€‚Literal比较现在会考虑类型。 例如Literal[0] == Literal[False]之å‰�的结果值为True。 现在则为False。 为支æŒ�æ¤æ”¹å�˜ï¼Œå†…部使用的类型缓å˜çŽ°åœ¨ä¹Ÿæ”¯æŒ�区分类型。现在,如果
Literal对象的任何å�‚数都ä¸�是 hashable ï¼Œåœ¨ç›¸ç‰æ€§æ¯”较时将引å�‘TypeError异常。请注æ„�,在声明Literal时,å�‚æ•°ä¸�å�¯å“ˆå¸Œä¸�会抛出错误:>>> from typing import Literal >>> Literal[{0}] >>> Literal[{0}] == Literal[{False}] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'set'
(由 Yurii Karabas 在 bpo-42345 ä¸è´¡çŒ®ã€‚)
åŠ å…¥æ–°å‡½æ•° typing.is_typeddict() ç”¨äºŽå†…éƒ¨æ£€æŸ¥æ ‡æ³¨æ˜¯å�¦ä¸º typing.TypedDict。 (由 Patrick Reader 在 bpo-41792 ä¸è´¡çŒ®ã€‚)
现在å�ªå£°æ˜Žäº†æ•°æ�®å�˜é‡�çš„ typing.Protocol å�类当使用 isinstance 检查时将引å�‘ TypeError 除é�žæ˜¯å¸¦æœ‰ runtime_checkable() 装饰器。 在之å‰�版本ä¸ï¼Œè¿™äº›æ£€æŸ¥æ˜¯é�™é»˜é€šè¿‡çš„。 如果用户需è¦�è¿�行时å��议则应当对其å�类设置 runtime_checkable() 装饰器。 (由 Yurii Karabas 在 bpo-38908 ä¸è´¡çŒ®ã€‚)
从 typing.io å’Œ typing.re å�模å�—导入现在将å�‘出 DeprecationWarning。 这些å�模å�—从 Python 3.8 开始已被弃用并将在未æ�¥çš„æŸ�个 Python 版本ä¸è¢«ç§»é™¤ã€‚ 任何属于这些å�模å�—的东西都应当改为直接从 typing 导入。 (由 Sebastian Rittau 在 bpo-38291 ä¸è´¡çŒ®ã€‚)
unittest¶
åŠ å…¥æ–°æ–¹æ³• assertNoLogs() ,以补充现有的 assertLogs()。(由 Kit Yan Choi 贡献于 bpo-39385 )
urllib.parse¶
Python 3.10 以下版本å…�许在 urllib.parse.parse_qs() å’Œ urllib.parse.parse_qsl() ä¸å�Œæ—¶ä½¿ç”¨ ; å’Œ & 作为查询å�‚数分隔符。出于安全考虑,并符å�ˆ W3C 最新的建议,这已ç»�被修改为å�ªå…�许用一ç§�分隔符,默认值为 &。 这一改å�˜ä¹Ÿå½±å“�到了 cgi.parse() å’Œ cgi.parse_multipart()ï¼Œå› ä¸ºä»–ä»¬å†…éƒ¨ç”¨åˆ°äº†è¿™äº›å‡½æ•°ã€‚æ›´å¤šç»†èŠ‚ï¼Œè¯·å�‚阅å�„自的文档。(由 Adam Goldschmidt ã€� Senthil Kumaran å’Œ Ken Jin 贡献于 bpo-42967 )
在 URL ä¸å˜åœ¨æ�¢è¡Œç¬¦æˆ–制表符å�¯èƒ½ä¼šå¯¼è‡´æŸ�ç§�å½¢å¼�的攻击。 æ ¹æ�®æ›´æ–°äº† RFC 3986 çš„ WHATWG 规范,urllib.parse ä¸çš„è§£æž�器将从 URL ä¸å޻除 ASCII æ�¢è¡Œç¬¦ \n, \r 和制表符 \t 以防æ¢è¿™ç§�攻击。 移除的å—符将由一个新的模å�—层级å�˜é‡� urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE æ�¥æŽ§åˆ¶ã€‚ (å�‚è§� gh-88048。)
xml¶
在 xml.sax.handler 模å�—ä¸åŠ å…¥ä¸€ä¸ª LexicalHandler 类。(由 Jonathan Gossage å’Œ Zackery Spytz 贡献于 bpo-35018 )
zipimport¶
åŠ å…¥ PEP 451 相关的方法: find_spec() ã€�zipimport.zipimporter.create_module() å’Œ zipimport.zipimporter.exec_module()。(由 Brett Cannon 贡献于 bpo-42131 )
åŠ å…¥ invalidate_caches() 方法。(由 Desmond Cheong 贡献于 bpo-14678 )
性能优化¶
çŽ°åœ¨ï¼Œæž„é€ å‡½æ•°
str()�bytes()和bytearray()速度更快了(�对象大约�速 30-40%)。(由 Serhiy Storchaka 贡献于 bpo-41334 )现在,
runpy导入的模å�—å�˜å°‘了。python3 -m module-name命令的å�¯åŠ¨æ—¶é—´å¹³å�‡åŠ å¿« 1.4 å€�。在 Linux 上,Python 3.9 çš„python3 -I -m module-name导入了69个模å�—,而 Python 3.10 å�ªå¯¼å…¥äº† 51个模å�—(少了 18 个)。(由 Victor Stinner 贡献于 bpo-41006 å’Œ bpo-41718)现在,
LOAD_ATTR指令会使用新的“å�•独æ“�作ç �缓å˜â€�机制。对于常规属性大约会æ��速 36%,而对于槽ä½�å±žæ€§ä¼šåŠ å¿« 44%。(由 Pablo Galindo å’Œ Yury Selivanov 贡献于 bpo-42093 ),并由 Guido van Rossum 贡献于 bpo-42927,基于最åˆ�在 PyPy å’Œ MicroPython ä¸å®žçŽ°çš„æ€�路。)现在,当用
--enable-optimizations构建 Python æ—¶ï¼Œä¼šåœ¨ç¼–è¯‘å’Œé“¾æŽ¥å‘½ä»¤è¡Œä¸æ·»åŠ-fno-semantic-interposition。 这会让用带å�‚æ•°--enable-sharedçš„gcc构建 Python 解释器时æ��速 30%。详情请å�‚阅`è¿™ç¯‡æ–‡ç« <https://developers.redhat.com/blog/2020/06/25/red-hat-enterprise-linux-8-2-brings-faster-python-3-8-run-speeds/>`_ 。(由 Victor Stinner å’Œ Pablo Galindo 贡献于 bpo-38980 )bz2/lzma/zlib模å�—用了新的输出缓冲区管ç�†ä»£ç �,并在_compression.DecompressReaderç±»ä¸æ·»åŠ.readall()函数。现在,bz2 解压过程æ��速了 1.09 å€� ~ 1.17 å€�,lzma 解压快了 1.20 å€� ~ 1.32 å€�,GzipFile.read(-1)快了 1.11 å€� ~ 1.18 å€�。(由 Ma Lin 贡献,由 Gregory P. Smith 审查, bpo-41486)当使用å—ç¬¦ä¸²åŒ–çš„æ ‡æ³¨æ—¶ï¼Œå‡½æ•°çš„æ ‡æ³¨å—å…¸ä¸�å†�是在创建函数时被创建。 它们被改为å˜å‚¨ä¸ºå—符串元组,并且函数对象会在需è¦�时延迟转æ�¢ä¸ºæ ‡æ³¨å—典。 这一优化å�¯å°†å®šä¹‰å¸¦æ ‡æ³¨å‡½æ•°çš„ CPU æ—¶é—´å‡�少一å�Šã€‚ (由 Yurii Karabas å’Œ Inada Naoki 在 bpo-42202 ä¸è´¡çŒ®ã€‚)
现在,å�串æ�œç´¢å‡½æ•°ï¼Œå¦‚
str1 in str2å’Œstr2.find(str1),有时会采用Crochemore & Perrin的“二路归并â€�å—符串æ�œç´¢ç®—法,以é�¿å…�é•¿å—符串的二次检索行为。(由 Dennis Sweeney 贡献于 bpo-41972 )为
_PyType_Lookup()å¢žåŠ å¾®å¹…ä¼˜åŒ–ä»¥æ��é«˜ç±»åž‹å±žæ€§ç¼“å˜æŸ¥è¯¢åœ¨å¸¸è§�缓å˜å‘½ä¸æƒ…况下的性能。 这使得解释器的平å�‡é€Ÿåº¦æ��å�‡è‡³ 1.04 å€�。 (由 Dino Viehland 在 bpo-43452 ä¸è´¡çŒ®ã€‚)下列内置函数现在支æŒ�更快速的 PEP 590 vectorcall 调用约定:
map(),filter(),reversed(),bool()å’Œfloat()。 (由 Donghee Na å’Œ Jeroen Demeyer 在 bpo-43575, bpo-43287, bpo-41922, bpo-41873 å’Œ bpo-41870 ä¸è´¡çŒ®ã€‚)BZ2File的性能通过移除内部的RLock获得改善。 这使得BZ2File在é�¢å¯¹å¤šä¸ªå�Œæ—¶çš„读å�–器和写入器ä¸�å†�是线程安全的,,就åƒ�gzipå’Œlzmaä¸çš„对应类一直以æ�¥çš„æƒ…å†µä¸€æ ·ã€‚ (由 Inada Naoki 在 bpo-43785 ä¸è´¡çŒ®ã€‚)
弃用¶
ç›®å‰� 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ä¸çš„一个将会引å�‘弃用è¦å‘Šã€‚ 在未æ�¥çš„版本ä¸å®ƒå°†æ”¹ä¸ºè¯æ³•è¦å‘Šï¼Œæœ€ç»ˆå°†æ”¹ä¸ºè¯æ³•错误。 (由 Serhiy Storchaka 在 bpo-43833 ä¸è´¡çŒ®ã€‚)从本å�‘布版开始,将å�‘起一次å��行动æ�¥æ¸…ç�†ä¸ºå…¼å®¹ Python 2.7 而ä¿�留的旧导入è¯ä¹‰ã€‚ 具体内容如下,
find_loader()/find_module()(被find_spec()å�–代),load_module()(被exec_module()å�–代),module_repr()(由导入系统负责处ç�†),__package__属性 (被__spec__.parentå�–代),__loader__属性 (被__spec__.loaderå�–代) 以å�Š__cached__属性 (被__spec__.cachedå�–代) 将被é€�æ¥ç§»é™¤ (还包括importlibä¸çš„其他类和方法)。ImportWarningå’Œ/或DeprecationWarning将被相应地引å�‘以帮助在过渡期间识别需è¦�更新的代ç �。整个
distutils命å��空间已被弃用,并将在 Python 3.12 ä¸è¢«ç§»é™¤ã€‚ 请å�‚阅 模å�—çš„å�˜åŒ– 一节了解更多信æ�¯ã€‚random.randrange()çš„é�žæ•´æ•°å�‚数已被弃用。ValueError已被弃用而应改用TypeError。(由 Serhiy Storchaka å’Œ Raymond Hettinger 贡献于 bpo-37319 )importlibçš„å�„ç§�load_module()方法自 Python 3.6 起就已被记录为弃用,现在还会触å�‘DeprecationWarning。请改用exec_module()。(由 Brett Cannon 贡献于 bpo-26131 )zimport.zipimporter.load_module()已弃用并被exec_module()代替。 (由 Brett Cannon 在 bpo-26131 ä¸è´¡çŒ®ã€‚)现在导入时使用
load_module()会引�ImportWarning,应改用exec_module()。 (由 Brett Cannon 贡献于 bpo-26131 )现在导入系统使用
importlib.abc.MetaPathFinder.find_module()å’Œimportlib.abc.PathEntryFinder.find_module()会触å�‘ImportWarningå› è€Œå»ºè®®åˆ†åˆ«æ”¹ç”¨importlib.abc.MetaPathFinder.find_spec()å’Œimportlib.abc.PathEntryFinder.find_spec()。 ä½ å�¯ä»¥ä½¿ç”¨importlib.util.spec_from_loader()æ�¥å��助移æ¤�。 (由 Brett Cannon 在 bpo-42134 ä¸è´¡çŒ®ã€‚)现在导入系统使用
importlib.abc.PathEntryFinder.find_loader()会触å�‘ImportWarningå› è€Œå»ºè®®æ”¹ç”¨importlib.abc.PathEntryFinder.find_spec()。 ä½ å�¯ä»¥ä½¿ç”¨importlib.util.spec_from_loader()æ�¥å��助移æ¤�。 (由 Brett Cannon 在 bpo-43672 ä¸è´¡çŒ®ã€‚)现在
importlib.abc.MetaPathFinder.find_module()(importlib.machinery.BuiltinImporter.find_module(),importlib.machinery.FrozenImporter.find_module(),importlib.machinery.WindowsRegistryFinder.find_module(),importlib.machinery.PathFinder.find_module(),importlib.abc.MetaPathFinder.find_module()),importlib.abc.PathEntryFinder.find_module()(importlib.machinery.FileFinder.find_module()) å’Œimportlib.abc.PathEntryFinder.find_loader()(importlib.machinery.FileFinder.find_loader()) çš„å�„个实现会引å�‘DeprecationWarning并预定在 Python 3.12 ä¸è¢«ç§»é™¤ï¼ˆä¹‹å‰�它们在 Python 3.4 ä¸å°±è¢«è®°å½•为已弃用)。 (由 Brett Cannon 在 bpo-42135 ä¸è´¡çŒ®ã€‚)importlib.abc.Finder已被弃用 (包括它唯一的方法find_module())。importlib.abc.MetaPathFinderå’Œimportlib.abc.PathEntryFinder都ä¸�å†�继承该类。 用户应当改为继承这两个类ä¸çš„一个。 (由 Brett Cannon 在 bpo-42135 ä¸è´¡çŒ®ã€‚)imp,importlib.find_loader(),importlib.util.set_package_wrapper(),importlib.util.set_loader_wrapper(),importlib.util.module_for_loader(),pkgutil.ImpImporterå’Œpkgutil.ImpLoader的弃用状æ€�已被更新以将 Python 3.12 列为预定è¦�移除它们的版本 (它们在之å‰�çš„ Python 版本ä¸å·²å¼€å§‹å¼•å�‘DeprecationWarning)。 (由 Brett Cannon 在 bpo-43720 ä¸è´¡çŒ®ã€‚)现在导入系统会先使用模å�—上的
__spec__属性å†�回退到module_repr()æ�¥ä½¿ç”¨æ¨¡å�—çš„__repr__()方法。 对module_repr()的使用预定在 Python 3.12 ä¸ç§»é™¤ã€‚ (由 Brett Cannon 在 bpo-42137 ä¸è´¡çŒ®ã€‚)importlib.abc.Loader.module_repr(),importlib.machinery.FrozenLoader.module_repr()å’Œimportlib.machinery.BuiltinLoader.module_repr()已被弃用并预定在 Python 3.12 ä¸ç§»é™¤ã€‚ (由 Brett Cannon 在 bpo-42136 ä¸è´¡çŒ®ã€‚)sqlite3.OptimizedUnicode自 Python 3.3 起就被移出文档并设为过时,当时它是被设为str的别å��。 现在它已被弃用,预定在 Python 3.12 ä¸ç§»é™¤ã€‚ (由 Erlend E. Aasland 在 bpo-42264 ä¸è´¡çŒ®ã€‚)未记入文档的内置函数
sqlite3.enable_shared_cache现在已被弃用,预定在 Python 3.12 ä¸ç§»é™¤ã€‚ SQLite3 强烈ä¸�建议使用它。 请å�‚阅 SQLite3 文档 了解详情。 如果必须è¦�使用共享缓冲区,请使用cache=shared查询å�‚æ•°æ�¥ä»¥ URI 模å¼�打开数æ�®åº“。 (由 Erlend E. Aasland 在 bpo-24464 ä¸è´¡çŒ®ã€‚)以下
threading方法已被弃用:threading.currentThread=>threading.current_thread()threading.activeCount=>threading.active_count()threading.Condition.notifyAll=>threading.Condition.notify_all()threading.Event.isSet=>threading.Event.is_set()threading.Thread.setName=>threading.Thread.namethreading.thread.getName=>threading.Thread.namethreading.Thread.isDaemon=>threading.Thread.daemonthreading.Thread.setDaemon=>threading.Thread.daemon
(由 Jelle Zijlstra 在 gh-87889 ä¸è´¡çŒ®ã€‚)
pathlib.Path.link_to()已被弃用并预定在 Python 3.12 ä¸ç§»é™¤ã€‚ 请改用pathlib.Path.hardlink_to()。 (由 Barney Gale 在 bpo-39950 ä¸è´¡çŒ®ã€‚)cgi.log()已被弃用并预定在 Python 3.12 ä¸ç§»é™¤ã€‚ (由 Inada Naoki 在 bpo-41139 ä¸è´¡çŒ®ã€‚)以下
ssl特性自 Python 3.6, Python 3.7 或 OpenSSL 1.1.0 起已被弃用并将在 3.11 ä¸ç§»é™¤:OP_NO_SSLv2,OP_NO_SSLv3,OP_NO_TLSv1,OP_NO_TLSv1_1,OP_NO_TLSv1_2å�ŠOP_NO_TLSv1_3会被sslSSLContext.minimum_versionå’ŒsslSSLContext.maximum_version代替。PROTOCOL_SSLv2,PROTOCOL_SSLv3,PROTOCOL_SSLv23,PROTOCOL_TLSv1,PROTOCOL_TLSv1_1,PROTOCOL_TLSv1_2å’ŒPROTOCOL_TLS已被弃用并应改用PROTOCOL_TLS_CLIENTå’ŒPROTOCOL_TLS_SERVERwrap_socket()会被ssl.SSLContext.wrap_socket()代替match_hostname()RAND_pseudo_bytes(),RAND_egd()NPN 特性如
ssl.SSLSocket.selected_npn_protocol()和ssl.SSLContext.set_npn_protocols()会被 ALPN 代替。
线程调试 (
PYTHONTHREADDEBUG环境å�˜é‡�) 在 Python 3.10 ä¸å·²è¢«å¼ƒç”¨å¹¶å°†åœ¨ Python 3.12 ä¸ç§»é™¤ã€‚ æ¤ç‰¹æ€§éœ€è¦� Python 的调试编译版。 (由 Victor Stinner 在 bpo-44584 ä¸è´¡çŒ®ã€‚)从
typing.ioå’Œtyping.reå�模å�—导入现在将å�‘出DeprecationWarning。 这些å�模å�—将在未æ�¥çš„ Python 版本ä¸è¢«ç§»é™¤ã€‚ 任何属于这些å�模å�—的东西都应当改为直接从typing导入。 (由 Sebastian Rittau 在 bpo-38291 ä¸è´¡çŒ®ã€‚)
移除¶
移除了
complex类的特殊方法__int__,__float__,__floordiv__,__mod__,__divmod__,__rfloordiv__,__rmod__å’Œ__rdivmod__。 它们总是会引å�‘TypeError。 (由 Serhiy Storchaka 在 bpo-41974 ä¸è´¡çŒ®ã€‚)ParserBase.error()方法(æ�¥è‡ªç§�有且未记入文档的_markupbase模å�—)已被移除。html.parser.HTMLParser是ParserBase的唯一å�类并且它的error()实现在 Python 3.5 ä¸å·²è¢«ç§»é™¤ã€‚ (由 Berker Peksag 在 bpo-31844 ä¸è´¡çŒ®ã€‚)移除了
unicodedata.ucnhash_CAPI属性,它是一个内部 PyCapsule 对象。 相关è�”çš„ç§�有_PyUnicode_Name_CAPI结构体已被移至内部 C API。 (由 Victor Stinner 在 bpo-42157 ä¸è´¡çŒ®ã€‚)移除了
parser模å�—,它在 3.9 ä¸ç”±äºŽåˆ‡æ�¢åˆ°æ–°çš„ PEG è§£æž�器而与仅被旧解æž�器所使用的 C æº�文件和头文件一起被弃用,包括node.h,parser.h,graminit.hå’Œgrammar.h。移除了公有 C API 函数
PyParser_SimpleParseStringFlags,PyParser_SimpleParseStringFlagsFilename,PyParser_SimpleParseFileFlagså’ŒPyNode_Compile,它们在 3.9 ä¸ç”±äºŽåˆ‡æ�¢åˆ°æ–°çš„ PEG è§£æž�器而被弃用。移除了
formatter模å�—,它在 Python 3.4 ä¸å·²è¢«å¼ƒç”¨ã€‚ 它相当过时ã€�æž�少被使用,并且未ç»�测试。 它最åˆ�计划在 Python 3.6 ä¸ç§»é™¤ï¼Œä½†æ¤ç§»é™¤è¢«å»¶è¿Ÿåˆ° Python 2.7 生命期结æ�Ÿä¹‹å�Žã€‚ 现有用户应当将它们用到的所有类都拷è´�到自己的代ç �ä¸ã€‚ (由 Donghee Na å’Œ Terry J. Reedy 在 bpo-42299 ä¸è´¡çŒ®ã€‚)移除了
PyModule_GetWarningsModule()函数,现在被由于_warnings模å�—在 2.6 ä¸è¢«è½¬æ�¢ä¸ºå†…置模å�—而å�˜å¾—没有用处。 (由 Hai Shi 在 bpo-42599 ä¸è´¡çŒ®ã€‚)从
collections模å�—ä¸ç§»é™¤äº†å·²è¢«å¼ƒç”¨çš„ 容器抽象基类 的别å��。 (由 Victor Stinner 在 bpo-37324 ä¸è´¡çŒ®ã€‚)loopå½¢å�‚已从大部分asyncioçš„ 高层级 API ä¸è¢«ç§»é™¤ï¼Œä¹‹å‰�它们在 Python 3.8 ä¸å·²è¢«å¼ƒç”¨ã€‚ 这一改å�˜çš„动机是多方é�¢çš„:这简化了高层级 API。
高层级 API ä¸çš„这些函数自 Python 3.7 èµ·å·²ç»�会éš�å¼�地获å�–当å‰�线程æ£åœ¨è¿�行的事件循环。 在大多数æ£å¸¸ä½¿ç”¨åœºæ™¯ä¸éƒ½æ²¡æœ‰å¿…è¦�å�‘ API ä¼ å…¥äº‹ä»¶å¾ªçŽ¯ã€‚
在处ç�†ä¸�å�Œçº¿ç¨‹ä¸è¿�è¡Œçš„äº‹ä»¶å¾ªçŽ¯æ—¶ä¼ é€’äº‹ä»¶å¾ªçŽ¯ç‰¹åˆ«å®¹æ˜“äº§ç”Ÿé”™è¯¯ã€‚
请注�低层级 API �将接�
loop。 请å�‚阅 Python API çš„å�˜åŒ– æ�¥èŽ·å�–有关如何替æ�¢çŽ°æœ‰ä»£ç �的示例。(由 Yurii Karabas, Andrew Svetlov, Yury Selivanov å’Œ Kyle Stanley 在 bpo-42392 ä¸è´¡çŒ®ã€‚)
移�到 Python 3.10¶
本节列出了先å‰�æ��述的更改以å�Šå�¯èƒ½éœ€è¦�更改代ç �的其他错误修æ£.
Python è¯æ³•ä¸çš„å�˜åŒ–¶
现在当编译之å‰�æœ‰æ•ˆçš„è¯æ³•时如果数å—ç±»å—é�¢å€¼å�Žé�¢ç´§è·Ÿä¸€ä¸ªå…³é”®å—(如在
0in xä¸ï¼‰åˆ™ä¼šå�‘出弃用è¦å‘Šã€‚ 在未æ�¥çš„版本ä¸å®ƒå°†è¢«æ”¹ä¸ºè¯æ³•è¦å‘Šï¼Œæœ€ç»ˆä¼šæ”¹ä¸ºè¯æ³•错误。 è¦�é�¿å…�è¦å‘Šå¹¶ä½¿ä»£ç �与未æ�¥çš„版本ä¿�æŒ�兼容å�ªéœ€åœ¨æ•°å—å’Œå�Žé�¢çš„关键å—ä¹‹é—´æ·»åŠ ä¸€ä¸ªç©ºæ ¼ã€‚ (由 Serhiy Storchaka 在 bpo-43833 ä¸è´¡çŒ®ã€‚)
Python API 的�化¶
traceback模å�—ä¸çš„format_exception()ã€�format_exception_only()å’Œprint_exception()函数的 etype å�‚数已更å��为 exc 。(由 Zackery Spytz å’Œ Matthias Bussonnier 贡献于 bpo-26389 )atexit: 在 Python 退出时,若用atexit.register()注册的回调失败,现在会记录其异常。以å‰�,å�ªæœ‰éƒ¨åˆ†å¼‚常被记录,最å�Žä¸€ä¸ªå¼‚常总是被é�™é»˜å¿½ç•¥ã€‚(由 Victor Stinner 贡献于 bpo-42639 )现在,泛型
collections.abc.Callable的类型å�‚æ•°æ‰�平化了,类似于typing.Callableç›®å‰�çš„å�šæ³•ã€‚è¿™æ„�味ç�€collections.abc.Callable[[int, str], str]çš„__args__将为(int, str, str);而以å‰�是([int, str], str)。 通过typing.get_args()或__args__访问å�‚数的代ç �需è¦�考虑到这一å�˜åŒ–。æ¤å¤–,为collections.abc.Callableç»™å‡ºæ— æ•ˆå�‚æ•°å�¯èƒ½ä¼šå¼•å�‘TypeError,而在 Python 3.9 ä¸åˆ™å�¯èƒ½ä¼šé�™é»˜ä¼ 入。(由 Ken Jin 贡献于 bpo-42195)现在,如果给定的形å�‚ä¸�是 16 ä½�æ— ç¬¦å�·æ•´æ•°ï¼Œ
socket.htons()å’Œsocket.ntohs()会引å�‘OverflowError而é�žDeprecationWarning。 (由 Erlend E. Aasland 在 bpo-42393 ä¸è´¡çŒ®ã€‚)The
loopparameter has been removed from most ofasyncio's high-level API following deprecation in Python 3.8.现在如下�程:
async def foo(loop): await asyncio.sleep(1, loop=loop)
应替�为:
async def foo(): await asyncio.sleep(1)
如果
foo()被特别设计æˆ� ä¸� è¿�行于当å‰�线程的è¿�行事件循环ä¸ï¼ˆæ¯”如è¿�行在å�¦ä¸€ä¸ªçº¿ç¨‹çš„事件循环ä¸ï¼‰ï¼Œè¯·è€ƒè™‘使用asyncio.run_coroutine_threadsafe()æ�¥ä»£æ›¿ã€‚(由 Yurii Karabas, Andrew Svetlov, Yury Selivanov å’Œ Kyle Stanley 在 bpo-42392 ä¸è´¡çŒ®ã€‚)
如果 globals å—兏䏿²¡æœ‰
"__builtins__"键,那么types.FunctionTypeæž„é€ å™¨çŽ°åœ¨å°†ç»§æ‰¿å½“å‰�值,而ä¸�是用{"None": None},这与eval()å’Œexec()函数一致。 利用def function(...): ...定义一个 Python 函数则ä¸�å�—å½±å“�,globals æ— æ³•è¢«è¿™ç§�è¯æ³•覆盖:它也是继承了当å‰�值。 (由 Victor Stinner 在 bpo-42990 ä¸è´¡çŒ®ã€‚)
C API 的�化¶
由于æ�¢æˆ�了新的 PEG è§£æž�程åº�,C è¯è¨€ API 函数
PyParser_SimpleParseStringFlagsã€�PyParser_SimpleParseStringFlagsFilenameã€�PyParser_SimpleParseFileFlagsã€�PyNode_Compile以å�Šè¿™äº›å‡½æ•°ç”¨åˆ°çš„类型struct _nodeå·²è¢«åˆ é™¤ã€‚çŽ°åœ¨åº”è¯¥ç”¨
Py_CompileString()å°†æº�代ç �直接编译为代ç �对象。然å�Žå�¯ä»¥ç”¨PyEval_EvalCode()之类的东西æ�¥å¯¹å…¶æ±‚值。特别地:
å…ˆ
PyParser_SimpleParseStringFlagså†�PyNode_Compile的调用,å�¯ä»¥ç”±Py_CompileString()代替。PyParser_SimpleParseFileFlags没有直接替代å“�。è¦�从FILE *å�‚数编译代ç �,需è¦�先用 C è¯è¨€è¯»å�–文件,然å�Žå°†ç»“æžœç¼“å†²åŒºä¼ ç»™Py_CompileString()。è¦�编译一个
char *给定文件�的文件,先显�打开该文件,�读�并进行编译。一�方法是利用io模�的PyImport_ImportModule()�PyObject_CallMethod()�PyBytes_AsString()和Py_CompileString(),如下图所示。(�略了声明和错误处�部分)io_module = Import_ImportModule("io"); fileobject = PyObject_CallMethod(io_module, "open", "ss", filename, "rb"); source_bytes_object = PyObject_CallMethod(fileobject, "read", ""); result = PyObject_CallMethod(fileobject, "close", ""); source_buf = PyBytes_AsString(source_bytes_object); code = Py_CompileString(source_buf, filename, Py_file_input);
对于
FrameObject对象,f_lastiæˆ�员现在代表一个å—代ç �å��移而ä¸�是相对å—节ç �å—符串的简å�•å��移。 è¿™æ„�味ç�€æ¤æ•°å—需è¦�乘以 2 æ‰�能被用于预期接å�—å—节å��移的 API (例如PyCode_Addr2Line())。 还è¦�注æ„�FrameObject对象的f_lastiæˆ�员已ä¸�被认为是稳定的:请改用PyFrame_GetLineNumber()。
CPython å—节ç �的改å�˜Â¶
现在
MAKE_FUNCTION指令将接å�—一个å—典或å—ç¬¦ä¸²å…ƒç»„ä½œä¸ºå‡½æ•°çš„æ ‡æ³¨ã€‚ (由 Yurii Karabas å’Œ Inada Naoki 在 bpo-42202 ä¸è´¡çŒ®ã€‚)
编译版的�化¶
PEP 644 :Python 现在�求 OpenSSL 1.1.1 以上版本。��支� OpenSSL 1.0.2。(由 Christian Heimes 贡献于 bpo-43669 )
编译 Python 现在需�用到 C99 函数
snprintf()和vsnprintf()。(由 Victor Stinner 贡献于 bpo-36020 )sqlite3需� SQLite 3.7.15 以上版本。(由 Sergey Fedoseev 和 Erlend E. Aasland 贡献于 bpo-40744 和 bpo-40810 )现在,
atexit模�必须编译为内置模�。(由 Victor Stinner 贡献于 bpo-42639 )在
configure脚本ä¸åŠ å…¥--disable-test-modules选项:ä¸�编译也ä¸�安装 test 模å�—。(由 Xavier de Gayeã€�Thomas Petazzoni å’Œ Peixing Xin 贡献于 bpo-27640)在
./configure脚本ä¸åŠ å…¥--with-wheel-pkg-dir=PATH 选项。如果指定了该选项,ensurepip模å�—会在该目录下查找setuptoolså’Œpip包:如果两者都å˜åœ¨ï¼Œå°±ä¼šä½¿ç”¨è¿™äº›åŒ…,而ä¸�是surepip 绑定的包。æŸ�些 Linux å�‘行版的打包ç–略建议ä¸�è¦�绑定ä¾�赖关系。比如 Fedora 在
/usr/share/python-wheels/目录下安装 wheel 包,而�安装ensurepip._bundled包。(由 Victor Stinner 贡献于 bpo-42856)
å¢žåŠ äº†æ–°çš„
configure --without-static-libpython é€‰é¡¹ï¼Œç”¨äºŽæ ‡æ˜Žä¸�编译libpythonMAJOR.MINOR.aé�™æ€�库并且ä¸�安装python.o对象文件。(由 Victor Stinner 在 bpo-43103 ä¸è´¡çŒ®ã€‚)
现在
configure脚本会在å�¯èƒ½çš„æƒ…况下使用pkg-config工具æ�¥æ£€æµ‹ Tcl/Tk 头文件和库的ä½�置。 在æ¤ä¹‹å‰�,这些ä½�ç½®å�¯é€šè¿‡--with-tcltk-includeså’Œ--with-tcltk-libsé…�置选项æ�¥æ˜¾å¼�地指明。 (由 Manolis Stamatogiannakis 在 bpo-42603 ä¸è´¡çŒ®ã€‚)为
configureè„šæœ¬åŠ å…¥--with-openssl-rpath选项。该选项简化了用定制版本 OpenSSL 编译 Python 的过程,例如./configure --with-openssl=/path/to/openssl --with-openssl-rpath=auto。(由 Christian Heimes 贡献于 bpo-43466 )
C API 的�化¶
PEP 652:稳定版 ABI 的维护¶
现在,用于扩展模�或嵌入 Python 的稳定版 ABI (应用程�二进制接�)已有显�的定义。 C API 的稳定性 �述了 C API 和 ABI 稳定性��和稳定版 ABI 的最佳实践。
(由 Petr Viktorin 在 PEP 652 å’Œ bpo-43795 ä¸è´¡çŒ®ã€‚).)
新的特性¶
现在
PyNumber_Index()的结果一定是int类型。æ¤å‰�å�¯èƒ½æ˜¯intçš„å�类实例。(由 Serhiy Storchaka 贡献于 bpo-40792 )Add a new
orig_argvmember to thePyConfigstructure: the list of the original command line arguments passed to the Python executable. (Contributed by Victor Stinner in bpo-23427.)åŠ å…¥å®�
PyDateTime_DATE_GET_TZINFO()å’ŒPyDateTime_TIME_GET_TZINFO(),用于访问datetime.datetimeå’Œdatetime.time对象的tzinfo属性。 (由 Zackery Spytz 贡献于 bpo-30155 ï¼‰åŠ å…¥
PyCodec_Unregister()函数,用于注销编解ç �器检索函数。(由 Hai Shi 贡献于 bpo-41842 ï¼‰åŠ å…¥
PyIter_Send()函数,å�¯ä¸�触å�‘StopIteration异常地å�‘è¿ä»£å™¨å�‘é€�æ•°æ�®ã€‚(由 Vladimir Matveev 贡献于 bpo-41756 )å�—é™� C API ä¸åŠ å…¥äº†
PyUnicode_AsUTF8AndSize()。(由 Alex Gaynor 贡献于 bpo-41784 ï¼‰åŠ å…¥
PyModule_AddObjectRef()函数:类似于PyModule_AddObject()但在æˆ�功å�Žä¸�会å�·å�–å�‚数对象的引用计数。(由 Victor Stinner 贡献于 bpo-1635741 ï¼‰åŠ å…¥
Py_NewRef()和Py_XNewRef()函数,用于递增指定对象的引用计数并返回该对象。(由 Victor Stinner 贡献于 bpo-42262 )现在,
PyType_FromSpecWithBases()å’ŒPyType_FromModuleAndSpec()函数å�¯æŽ¥å�—一个类作为 bases å�‚数。(由 Serhiy Storchaka 贡献于 bpo-42423 )PyType_FromModuleAndSpec()函数现在接å�— NULLtp_docæ§½ä½�。 (由 Hai Shi 在 bpo-41832 ä¸è´¡çŒ®ã€‚)PyType_GetSlot()函数现在å�¯ä»¥æŽ¥å�— é�™æ€�类型。 (由 Hai Shi å’Œ Petr Viktorin 在 bpo-41073 ä¸è´¡çŒ®ã€‚)新增
PySet_CheckExact()函数到 C-API 用于检查一个对象是å�¦æ˜¯set的实例但ä¸�是其å�类型的实例。 (由 Pablo Galindo 在 bpo-43277 ä¸è´¡çŒ®ã€‚ï¼‰å¢žåŠ äº†
PyErr_SetInterruptEx(),它å…�è®¸ä¼ å…¥ä¸€ä¸ªä¿¡å�·åº�å�·ç”¨äºŽè¿›è¡Œæ¨¡æ‹Ÿã€‚ (由 Antoine Pitrou 在 bpo-43356 ä¸è´¡çŒ®ã€‚)现在,Python 以调试模å¼�编译 时也支æŒ�å�—é™� C API 的使用了(需先定义
Py_DEBUGå®�)。在å�—é™� C API ä¸ï¼Œå¦‚æžœ Python 是以调试模å¼�编译的,且Py_LIMITED_APIå®�以 Python 3.10 ä»¥ä¸Šç‰ˆæœ¬ä¸ºç›®æ ‡ï¼Œé‚£ä¹ˆçŽ°åœ¨Py_INCREF()å’ŒPy_DECREF()函数实现为é�žé€�明的函数调用,而é�žç›´æŽ¥è®¿é—®PyObject.ob_refcntæˆ�员。在调试模å¼�下支æŒ�å�—é™� C API æˆ�为å�¯èƒ½ï¼Œæ˜¯å› 为自 Python 3.8 èµ·PyObject结构体在å�‘布模å¼�和调试模å¼�下是相å�Œçš„(å�‚è§� bpo-36465 )。在
--with-trace-refs特殊编译方å¼�下(Py_TRACE_REFSå®�),ä»�ä¸�支æŒ�使用å�—é™� C API 。(由 Victor Stinner 贡献于 bpo-43688 ï¼‰åŠ å…¥
Py_Is(x, y)函数,用于测试 x 对象是å�¦æ˜¯ y 对象,ç‰ä»·äºŽ Python ä¸çš„x is yã€‚è¿˜åŠ å…¥äº†Py_IsNone()ã€�Py_IsTrue()ã€�Py_IsFalse()函数,分别用于测试æŸ�对象是å�¦ä¸ºNoneå�•例ã€�Trueå�•例或Falseå�•例。(由 Victor Stinner 贡献于 bpo-43753 )新增由 C 代ç �控制垃圾回收器的函数:
PyGC_Enable(), ã€�PyGC_Disable()ã€�PyGC_IsEnabled()。这些函数å…�许从 C 代ç �激活ã€�å�œæ¢å’ŒæŸ¥è¯¢åžƒåœ¾å›žæ”¶å™¨çš„状æ€�,而ä¸�必导入gc模å�—。新增了
Py_TPFLAGS_DISALLOW_INSTANTIATIONç±»åž‹æ——æ ‡ç”¨äºŽç¦�æ¢åˆ›å»ºç±»åž‹å®žä¾‹ã€‚ (由 Victor Stinner 在 bpo-43916 ä¸è´¡çŒ®ã€‚).)新增了
Py_TPFLAGS_IMMUTABLETYPEç±»åž‹æ——æ ‡ç”¨äºŽåˆ›å»ºä¸�å�¯å�˜ç±»åž‹å¯¹è±¡ï¼šç±»åž‹çš„属性ä¸�å�¯è¢«è®¾ç½®æˆ–åˆ é™¤ã€‚ (由 Victor Stinner å’Œ Erlend E. Aasland 在 bpo-43908 ä¸è´¡çŒ®ã€‚)
移�到 Python 3.10¶
现在必须定义
PY_SSIZE_T_CLEANå®�æ‰�能使用PyArg_ParseTuple()å’ŒPy_BuildValue()æ ¼å¼�ï¼Œè¿™äº›æ ¼å¼�会使用#:es#,et#,s#,u#,y#,z#,U#å’ŒZ#。 å�‚è§� è§£æž�å�‚数并构建值å�˜é‡� å’Œ PEP 353。 (由 Victor Stinner 在 bpo-40943 ä¸è´¡çŒ®ã€‚)由于
Py_REFCNT()已改为内è�”é�™æ€�函数,Py_REFCNT(obj) = new_refcntå¿…é¡»æ�¢æˆ�Py_SET_REFCNT(obj, new_refcnt): å�‚è§�Py_SET_REFCNT()(自 Python 3.9 èµ·æ��供)。为ä¿�æŒ�å�‘下兼容,å�¯ç”¨æ¤å®�:#if PY_VERSION_HEX < 0x030900A4 # define Py_SET_REFCNT(obj, refcnt) ((Py_REFCNT(obj) = (refcnt)), (void)0) #endif
(由 Victor Stinner 在 bpo-39573 ä¸è´¡çŒ®ã€‚)
由于历å�²åŽŸå› ï¼Œæ›¾ç»�å…�许调用
PyDict_GetItem()时�带 GIL 。 现在则�行了。(由 Victor Stinner 贡献于 bpo-40839 )现在,
PyUnicode_FromUnicode(NULL, size)和PyUnicode_FromStringAndSize(NULL, size)会引�DeprecationWarning。 请利用PyUnicode_New()获得�带�始数�的 Unicode 对象。(由 Inada Naoki 贡献于 bpo-36346 )�有结构体
_PyUnicode_Name_CAPI(PyCapsule APIunicodedata.ucnhash_CAPI)已被移入内部 C API。(由 Victor Stinner 贡献于 bpo-42157 )现在
Py_GetPath(),Py_GetPrefix(),Py_GetExecPrefix(),Py_GetProgramFullPath(),Py_GetPythonHome()å’ŒPy_GetProgramName()函数如果在Py_Initialize()之å‰�(在 Python 被åˆ�始化之å‰�)被调用将返回NULL。 请使用新的 Pythonåˆ�始化é…�ç½® API æ�¥èŽ·å�– Python 路径é…�置。 (由 Victor Stinner 在 bpo-42260 ä¸è´¡çŒ®ã€‚)å®�
PyList_SET_ITEM()ã€�PyTuple_SET_ITEM()å’ŒPyCell_SET()ä¸�å�¯å†�用作左值或å�³å€¼ã€‚例如,现在x = PyList_SET_ITEM(a, b, c)å’ŒPyList_SET_ITEM(a, b, c) = x会失败并æ��示编译器错误。 è¿™å�¯ä»¥é˜²æ¢if (PyList_SET_ITEM (a, b, c) < 0) ...之类的检测å�‘生问题。(由 Zackery Spytz å’Œ Victor Stinner 贡献于 bpo-30459 )é�žå�—é™� API 文件
odictobject.h,parser_interface.h,picklebufobject.h,pyarena.h,pyctype.h,pydebug.h,pyfpe.hå’Œpytime.h已被移至Include/cpython目录。 这些文件ä¸�å�¯è¢«ç›´æŽ¥åŒ…æ‹¬ï¼Œå› ä¸ºå®ƒä»¬å·²ç»�在Python.hä¸è¢«åŒ…括了;å�‚è§� 包å�«æ–‡ä»¶ã€‚ 如果它们已被直接包括,请考虑改为包括Python.h。 (由 Nicholas Sim 在 bpo-35134 ä¸è´¡çŒ®ã€‚)请使用
Py_TPFLAGS_IMMUTABLETYPEç±»åž‹æ——æ ‡æ�¥åˆ›å»ºä¸�å�¯å�˜ç±»åž‹å¯¹è±¡ã€‚ 请勿ä¾�赖于Py_TPFLAGS_HEAPTYPEæ�¥ç¡®å®šç±»åž‹å¯¹è±¡æ˜¯å�¦å�¯å�˜ï¼›åº”改为检查是å�¦è®¾ç½®äº†Py_TPFLAGS_IMMUTABLETYPE。 (由 Victor Stinner å’Œ Erlend E. Aasland 在 bpo-43908 ä¸è´¡çŒ®ã€‚ï¼‰æœªè¢«åŠ å…¥æ–‡æ¡£çš„å‡½æ•°
Py_FrozenMain已从å�—é™� API ä¸ç§»é™¤ã€‚ 该函数主è¦�适用于 Python 的定制版本。 (由 Petr Viktorin 在 bpo-26241 ä¸è´¡çŒ®ã€‚)
弃用¶
现在
PyUnicode_InternImmortal()函数已被弃用,并将在 Python 3.12 ä¸ç§»é™¤ï¼šè¯·æ”¹ç”¨PyUnicode_InternInPlace()。(由 Victor Stinner 贡献于 bpo-41692 )
移除¶
移除了
Py_UNICODE_str*函数,它被用于控制Py_UNICODE*å—符串。 (由 Inada Naoki 在 bpo-41123 ä¸è´¡çŒ®ã€‚)Py_UNICODE_strlen: 使用PyUnicode_GetLength()或PyUnicode_GET_LENGTHPy_UNICODE_strcat: 使用PyUnicode_CopyCharacters()或PyUnicode_FromFormat()Py_UNICODE_strcpy,Py_UNICODE_strncpy: 使用PyUnicode_CopyCharacters()或PyUnicode_Substring()Py_UNICODE_strcmp: 使用PyUnicode_Compare()Py_UNICODE_strncmp: 使用PyUnicode_Tailmatch()Py_UNICODE_strchr,Py_UNICODE_strrchr: 使用PyUnicode_FindChar()
移除了
PyUnicode_GetMax()。 请è¿�移到新的 (PEP 393) API。 (由 Inada Naoki 在 bpo-41103 ä¸è´¡çŒ®ã€‚)移除了
PyLong_FromUnicode()。 请è¿�移到PyLong_FromUnicodeObject()。 (由 Inada Naoki 在 bpo-41103 ä¸è´¡çŒ®ã€‚)移除了
PyUnicode_AsUnicodeCopy()。 请使用PyUnicode_AsUCS4Copy()或PyUnicode_AsWideCharString()(由 Inada Naoki 在 bpo-41103 ä¸è´¡çŒ®ã€‚)移除了
_Py_CheckRecursionLimitå�˜é‡�:它已被PyInterpreterState结构体的ceval.recursion_limit所å�–代。 (由 Victor Stinner 在 bpo-41834 ä¸è´¡çŒ®ã€‚)移除了未记入文档的å®�
Py_ALLOW_RECURSIONå’ŒPy_END_ALLOW_RECURSION以å�ŠPyInterpreterState结构体的recursion_criticalå—æ®µã€‚ (由 Serhiy Storchaka 在 bpo-41936 ä¸è´¡çŒ®ã€‚)移除了未记入文档的
PyOS_InitInterrupts()函数。Python �始化时已��安装了信�处� handler:��PyConfig.install_signal_handlers。(由 Victor Stinner 贡献于 bpo-41713 )移除了
PyAST_Validate()函数。�能�使用公有 C API �构建 AST 对象(mod_ty类型)了。该函数已�属于�� C API(PEP 384 )。(由 Victor Stinner 贡献于 bpo-43244 )移除了
symtable.h头文件�未写入文档的函数:PyST_GetScope()PySymtable_Build()PySymtable_BuildObject()PySymtable_Free()Py_SymtableString()Py_SymtableStringObject()
Py_SymtableString()函数误为稳定版 ABI å�´æ— æ³•ä½¿ç”¨ï¼Œå› ä¸ºsymtable.h头文件ä¸�属于å�—é™� C API。请改用 Python
symtable模å�—。 (由 Victor Stinner 在 bpo-43244 ä¸è´¡çŒ®ã€‚)PyOS_ReadlineFunctionPointer()已从å�—é™� C API 头文件和python3.dllä¸ç§»é™¤ï¼Œæ¤ dll 为 Windows ä¸çš„稳定版 ABI 库。由于该函数å�¯æŽ¥å�—一个FILE*å�‚æ•°ï¼Œæ‰€ä»¥æ— æ³•ä¿�è¯�å…¶ ABI 稳定性。(由 Petr Viktorin 贡献于 bpo-43868 )移除了
ast.h,asdl.hå’ŒPython-ast.h头文件。 这些函数未入文档且ä¸�属于å�—é™� C API。这些头文件ä¸å®šä¹‰çš„大多数å��称都ä¸�带Pyå‰�ç¼€ï¼Œå› æ¤å�¯èƒ½ä¼šé€ æˆ�命å��冲çª�。比如Python-ast.h定义了一个Yieldå®�,就会与å�¦ä¸€ä¸ªWindows<winbase.h>头文件ä¸çš„Yield冲çª�。请改用 Pythonast模å�—。(由 Victor Stinner 贡献于 bpo-43244 )移除了用到
struct _mod类型的编译器和解æž�å™¨å‡½æ•°ï¼Œå› ä¸ºå…¬å…±çš„ AST C API 已被移除:PyAST_Compile()PyAST_CompileEx()PyAST_CompileObject()PyFuture_FromAST()PyFuture_FromASTObject()PyParser_ASTFromFile()PyParser_ASTFromFileObject()PyParser_ASTFromFilename()PyParser_ASTFromString()PyParser_ASTFromStringObject()
这些函数未入文档且�属于�� C API。(由 Victor Stinner 贡献于 bpo-43244 )
移除了包�下列函数的头文件
pyarena.h:PyArena_New()PyArena_Free()PyArena_Malloc()PyArena_AddPyObject()
这些函数未记入文档,且�属于�� C API,仅由编译器内部使用。(由 Victor Stinner 贡献于 bpo-43244 )
PyThreadState.use_tracingæˆ�å‘˜å·²è¢«åˆ é™¤ï¼Œä»¥ä¼˜åŒ– Python 。(ç”± Mark Shannon 在 bpo-43760 ä¸è´¡çŒ®ã€‚)
3.10.7 ä¸çš„é‡�è¦�安全特性¶
使用å��进制以外的底,如 2(二进制)ã€�4ã€�8(八进制)ã€�16(å��å…进制)ã€�32 以外作为基数在 int å’Œ str 之间进行转æ�¢ï¼Œå¦‚æžœå—符串形å¼�çš„æ•°å—æ•°é‡�超过一个é™�制,会抛出 ValueError,以é�¿å…�å› ç®—æ³•å¤�æ�‚而导致的潜在拒ç»�æœ�务攻击。这是对 CVE-2020-10735 的缓解方案。这个é™�制å�¯ä»¥é€šè¿‡çŽ¯å¢ƒå�˜é‡�ã€�å‘½ä»¤è¡Œæ——æ ‡æˆ– sys API 进行é…�置或ç¦�用。å�‚è§� integer string conversion length limitation 文档。默认é™�制是å—符串形å¼�çš„ 4300 ä½�æ•°å—。
3.10.8 ä¸çš„é‡�è¦�安全特性¶
已被弃用的 mailcap 模å�—现在将拒ç»�å°†ä¸�安全的文本(文件å��ã€�MIME 类型ã€�å½¢å�‚ç‰ï¼‰æ³¨å…¥åˆ° shell 命令ä¸ã€‚ 它ä¸�会使用æ¤ç±»æ–‡æœ¬ï¼Œè€Œæ˜¯ä¼šå�‘出è¦å‘Šå¹¶ä¸”将视作未找到匹é…�结果(或者对于测试命令,将视作测试失败)。 (由 Petr Viktorin 在 gh-98966 ä¸è´¡çŒ®ã€‚)
3.10.12 ä¸çš„é‡�è¦�å�˜åŒ–¶
tarfile¶
tarfileä¸çš„æ��å�–方法和shutil.unpack_archive()都新增了 filter å�‚数以å…�许é™�制å�¯èƒ½ä»¤äººæ„�外或å�±é™©çš„ tar ç‰¹æ€§ï¼Œä¾‹å¦‚åœ¨ç›®æ ‡ç›®å½•ä¹‹å¤–åˆ›å»ºæ–‡ä»¶ã€‚ 相关细节å�‚è§� 解压缩过滤器。 在 Python 3.12 ä¸ï¼Œä¸�带 filter å�‚数的用法将显示DeprecationWarning。 在 Python 3.14 ä¸ï¼Œé»˜è®¤å€¼å°†åˆ‡æ�¢ä¸º'data'。 (由 Petr Viktorin 在 PEP 706 ä¸è´¡çŒ®ã€‚)