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,用户自定义的类型ä¿�护器

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

  • PEP 644,è¦�求 OpenSSL 1.1.1 或更新的版本

  • PEP 632,弃用 distutils 模å�—。

  • PEP 623,弃用并准备移除 PyUnicodeObject 中的 wstr æˆ�员。

  • PEP 624,移除 Py_UNICODE ç¼–ç �器 API

  • PEP 597,增加å�¯é€‰çš„ EncodingWarning

新的特性¶

带圆括�的上下文管�器¶

现在已支�使用外层圆括��使多个上下文管�器�以连续多行地书写。 这�许将过长的上下文管�器集能够以与之� 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 语��形�给出的一系列模�进行比较。 具体�说,模�匹�的�作如下:

  1. 使用具有特定类型和形状的数� (subject)

  2. 针对 subject 在 match 语�中求值

  3. 从上到下对 subject 与 case 语�中的�个模�进行比较直到确认匹�到一个模�。

  4. 执行与被确认匹�的模�相关�的动作。

  5. 如果没有确认到一个完全的匹�,则如果�供了使用通�符 _ 的最�一个 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 所�述的��类型检查器的行为。

  1. Literal 现在将是去��的形�。

  2. Literal 对象的相等性比较现在将与顺�无关。

  3. Literal 比较现在会考虑类型。 例如 Literal[0] == Literal[False] 之�的结果值为 True。 现在则为 False。 为支�此改�,内部使用的类型缓存现在也支�区分类型。

  4. 现在,如果 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 方法已被弃用:

    (由 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 中移除:

  • 线程调试 (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 中已被弃用。 这一改å�˜çš„动机是多方é�¢çš„:

    1. 这简化了高层级 API。

    2. 高层级 API 中的这些函数自 Python 3.7 起已�会��地获�当�线程正在�行的事件循环。 在大多数正常使用场景中都没有必�� API 传入事件循环。

    3. 在处���线程中�行的事件循环时传递事件循环特别容易产生错误。

    请注�低层级 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 loop parameter has been removed from most of asyncio'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_argv member to the PyConfig structure: 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() 函数现在接å�— NULL tp_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 API unicodedata.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 中贡献。)

  • 移除了 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 冲çª�。请改用 Python ast 模å�—。(由 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 中贡献。)