Python 3.10 中的新功能¶
- 编辑:
Pablo Galindo Salgado
本文介绍了 Python 3.10 相对于 3.9 的新功能。Python 3.10 于 2021 年 10 月 4 日发布。有关完整详细信息,请参阅变更日志。
摘要 – 版本亮点¶
新语法功能
标准库中的新功能
PEP 618,为 zip 添加可选的长度检查。
解释器改进
PEP 626,用于调试和其他工具的精确行号。
新的类型提示功能
重要的弃用、删除或限制
新功能¶
带括号的上下文管理器¶
现在支持在上下文管理器中使用括起来的括号来跨多行继续。这允许以类似于先前 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 中贡献。)
更好的错误消息¶
SyntaxErrors¶
当解析包含未闭合的括号或方括号的代码时,解释器现在包括未闭合的括号或方括号的位置,而不是显示*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 中贡献。)
没有
except
或finally
块的try
块>>> 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 中贡献。)
IndentationErrors¶
许多 IndentationError
异常现在具有更多关于哪种块需要缩进的上下文,包括语句的位置
>>> def foo():
... if lel:
... x = 2
File "<stdin>", line 3
x = 2
^
IndentationError: expected an indented block after 'if' statement in line 2
AttributeErrors¶
打印 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
)在
match
语句中计算subject
将 subject 与
case
语句中的每个模式从上到下进行比较,直到确认匹配。执行与已确认匹配的模式关联的操作
如果未确认精确匹配,则将使用最后一个 case(通配符
_
)(如果提供)作为匹配的 case。 如果未确认精确匹配且不存在通配符 case,则整个 match 块将不会执行任何操作。
声明式方法¶
读者可能通过将主题(数据对象)与 C、Java 或 JavaScript(以及许多其他语言)中的 switch 语句中的字面量(模式)匹配的简单示例来了解模式匹配。 switch 语句通常用于比较对象/表达式与包含字面量的 case 语句。
在诸如 Scala 和 Elixir 之类的语言中可以找到更强大的模式匹配示例。 通过结构模式匹配,该方法是“声明式”的,并明确声明数据匹配的条件(模式)。
虽然可以使用使用嵌套 “if” 语句的 “命令式” 指令序列来完成类似于结构模式匹配的操作,但它不如 “声明式” 方法清晰。 相反,“声明式” 方法声明匹配的条件,并通过其显式模式更具可读性。 虽然结构模式匹配可以以最简单的形式使用,比较 case 语句中的变量与字面量,但它对于 Python 的真正价值在于处理主题的类型和形状。
简单模式:匹配字面量¶
让我们看看这个例子,这是最简单的形式的模式匹配:一个值(即主题)与多个字面量(即模式)匹配。 在下面的示例中,status
是 match 语句的主题。 这些模式是每个 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"
如果向上述函数传递 418 的 status
,“I'm a teapot” 将被返回。 如果向上述函数传递 500 的 status
,则带有 _
的 case 语句将作为通配符匹配,并返回 “Something's wrong with the internet”。 请注意最后一个块:变量名 _
充当通配符,并确保该主题始终匹配。 _
的使用是可选的。
您可以使用 |
(“或”) 在单个模式中组合多个字面量
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 语句中使用 _
,则可能不存在匹配项。 如果不存在匹配项,则行为为无操作。 例如,如果传递了 500 的 status
,则会发生无操作。
具有字面量和变量的模式¶
模式看起来像解包赋值,并且模式可用于绑定变量。 在此示例中,可以将数据点解包到其 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")
具有位置参数的模式¶
您可以将位置参数与某些为其属性提供排序的内置类(例如,数据类)一起使用。 您还可以通过在类中设置 __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
子句,称为 “守卫”。 如果守卫为 false,则 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 :(")
可选的 EncodingWarning
和 encoding="locale"
选项¶
TextIOWrapper
和 open()
的默认编码取决于平台和区域设置。由于大多数 Unix 平台都使用 UTF-8,因此在打开 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
为 true 并且使用特定于区域设置的默认编码时,会发出此警告。
添加了 -X warn_default_encoding
选项和 PYTHONWARNDEFAULTENCODING
以启用警告。
有关更多信息,请参阅 文本编码。
其他语言更改¶
int
类型有一个新的方法int.bit_count()
,返回给定整数的二进制展开中 1 的个数,也称为 population count。(由 Niklas Fiekas 在 bpo-29882 中贡献。)由
dict.keys()
、dict.values()
和dict.items()
返回的视图现在都具有一个mapping
属性,该属性提供一个types.MappingProxyType
对象,该对象包装原始字典。(由 Dennis Sweeney 在 bpo-40890 中贡献。)接受整数参数的内置函数和扩展函数不再接受
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 中贡献。)使用
from __future__ import annotations
时,复杂目标(PEP 526 定义的simple name
目标之外的所有内容)的注解不再产生任何运行时效果。(由 Batuhan Taskaya 在 bpo-42737 中贡献。)类和模块对象现在按需惰性创建空的注解字典。 注解字典存储在对象的
__dict__
中以实现向后兼容。 这改进了使用__annotations__
的最佳实践; 有关更多信息,请参阅 注解最佳实践。(由 Larry Hastings 在 bpo-43901 中贡献。)由于它们的副作用,在
from __future__ import annotations
下,现在禁止使用由yield
、yield from
、await
或命名表达式组成的注解。(由 Batuhan Taskaya 在 bpo-42725 中贡献。)在
from __future__ import annotations
下,未绑定变量、super()
以及其他可能更改符号表处理的表达式的用法现在都无效。(由 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¶
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¶
添加一个 codecs.unregister()
函数来取消注册编解码器搜索函数。(由 Hai Shi 在 bpo-41842 中贡献。)
collections.abc¶
对于 collections.abc.Callable
的 参数化泛型 的 __args__
现在与 typing.Callable
一致。collections.abc.Callable
泛型现在会展平类型参数,类似于 typing.Callable
当前所做的。这意味着 collections.abc.Callable[[int, str], str]
将具有 (int, str, str)
的 __args__
;之前是 ([int, str], str)
。为了允许此更改,现在可以对 types.GenericAlias
进行子类化,并且当对 collections.abc.Callable
类型进行下标时,将返回一个子类。请注意,对于 collections.abc.Callable
的无效参数化形式(可能在 Python 3.9 中静默传递),可能会引发 TypeError
。(由 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 中贡献。)
如果底层 curses 库提供了 BUTTON5_*
常量,则现在它们在 curses
模块中公开。(由 Zackery Spytz 在 bpo-39273 中贡献。)
dataclasses¶
__slots__¶
在 dataclasses.dataclass()
装饰器中添加 slots
参数。(由 Yurii Karabas 在 bpo-42269 中贡献。)
仅限关键字的字段¶
dataclasses 现在支持在生成的 __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
,请注意,由于仅限关键字的字段需要跟随非仅限关键字的字段,因此存在有关重新排序字段的规则。有关详细信息,请参阅完整的 dataclasses 文档。
您还可以指定所有跟随 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
命令已被删除。现在建议使用 bdist_wheel
命令在 Windows 上分发二进制包。(由 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
。作为模块常量提供的 Stdlib 枚举的 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 中贡献。)
当 mode 为 “r” 且文件被压缩时,fileinput.hook_compressed()
现在会返回 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 和其他问题中贡献。)
pbkdf2_hmac()
的纯 Python 回退已弃用。将来,只有在 Python 使用 OpenSSL 支持构建时,PBKDF2-HMAC 才可用。(由 Christian Heimes 在 bpo-43880 中贡献。)
hmac¶
hmac 模块现在内部使用 OpenSSL 的 HMAC 实现。(由 Christian Heimes 在 bpo-40645 中贡献。)
IDLE 和 idlelib¶
使 IDLE 调用 sys.excepthook()
(当启动时不带 '-n' 时)。用户钩子以前被忽略。(由 Ken Hilton 在 bpo-43008 中贡献。)
重新排列设置对话框。将“常规”选项卡拆分为“窗口”和“Shell/Ed”选项卡。将扩展帮助菜单的帮助源移至“扩展”选项卡。为新选项腾出空间并缩短对话框。后者使对话框更好地适应小屏幕。(由 Terry Jan Reedy 在 bpo-40468 中贡献。) 将缩进空格设置从“字体”选项卡移动到新的“窗口”选项卡。(由 Mark Roseman 和 Terry Jan Reedy 在 bpo-33962 中贡献。)
上面的更改已向后移植到 3.9 维护版本。
添加一个 Shell 侧边栏。将主提示符('>>>')移动到侧边栏。将辅助提示符('...')添加到侧边栏。左键单击和可选拖动选择一行或多行文本,就像编辑器行号侧边栏一样。选择文本行后右键单击会显示一个上下文菜单,其中包含“复制带有提示符”。这将侧边栏中的提示符与选定文本中的行压缩在一起。此选项也出现在文本的上下文菜单中。(由 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 的功能对等 (历史记录)。
importlib.metadata 入口点 现在通过新的 importlib.metadata.EntryPoints 类,为按组和名称选择入口点提供了更好的体验。有关弃用和用法的更多信息,请参阅文档中的兼容性说明。
添加了 importlib.metadata.packages_distributions() 用于将顶级 Python 模块和包解析为其 importlib.metadata.Distribution。
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 RTOS 添加 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 中贡献。)
platform¶
添加 platform.freedesktop_os_release()
从 freedesktop.org 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¶
当创建 shelves 时,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 的密码。安全级别 2 禁止安全性低于 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
的任何参数不是 可哈希的,则Literal
对象现在会在相等性比较期间引发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 上,python3 -I -m module-name
在 Python 3.9 上导入 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%。有关更多详细信息,请参阅这篇文章。(由 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 向量调用约定:
map()
、filter()
、reversed()
、bool()
和float()
。(由 Donghee Na 和 Jeroen Demeyer 在 bpo-43575、bpo-43287、bpo-41922、bpo-41873 和 bpo-41870 中贡献。)通过删除内部
RLock
,BZ2File
的性能得到了提高。这使得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__()
方法。计划在 Python 3.12 中移除对module_repr()
的使用。(由 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.name
threading.thread.getName
=>threading.Thread.name
threading.Thread.isDaemon
=>threading.Thread.daemon
threading.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
被minimum_version
和maximum_version
替换。PROTOCOL_SSLv2
、PROTOCOL_SSLv3
、PROTOCOL_SSLv23
、PROTOCOL_TLSv1
、PROTOCOL_TLSv1_1
、PROTOCOL_TLSv1_2
和PROTOCOL_TLS
已被弃用,转而使用PROTOCOL_TLS_CLIENT
和PROTOCOL_TLS_SERVER
wrap_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 中贡献。)删除了私有且未公开的
_markupbase
模块中的ParserBase.error()
方法。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
模块,该模块由于切换到新的 PEG 解析器而在 3.9 中被弃用,以及所有仅由旧解析器使用的 C 源代码和头文件,包括node.h
、parser.h
、graminit.h
和grammar.h
。删除了公共 C API 函数
PyParser_SimpleParseStringFlags
、PyParser_SimpleParseStringFlagsFilename
、PyParser_SimpleParseFileFlags
和PyNode_Compile
,这些函数由于切换到新的 PEG 解析器而在 3.9 中被弃用。移除了在 Python 3.4 中已弃用的
formatter
模块。它有些过时、很少使用,并且没有进行测试。最初计划在 Python 3.6 中删除它,但此类删除被推迟到 Python 2.7 EOL 之后。现有用户应将其使用的任何类复制到他们的代码中。(由 Donghee Na 和 Terry J. Reedy 在 bpo-42299 中贡献。)移除了
PyModule_GetWarningsModule()
函数,由于_warnings
模块在 2.6 版本中被转换为内置模块,该函数现在已无用。(由 Hai Shi 在 bpo-42599 中贡献。)从
collections
模块中移除了对 集合抽象基类 的已弃用别名。(由 Victor Stinner 在 bpo-37324 中贡献。)在 Python 3.8 中弃用后,
loop
参数已从asyncio
的大多数 高级 API 中删除。此更改背后的动机是多方面的。这简化了高级 API。
自从 Python 3.7 以来,高级 API 中的函数一直在隐式获取当前线程正在运行的事件循环。在大多数正常使用情况下,没有必要将事件循环传递给 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 中的更改¶
format_exception()
、format_exception_only()
和print_exception()
函数在traceback
模块中的 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 中贡献。)在 Python 3.8 中弃用后,
loop
参数已从asyncio
的大多数 高级 API 中删除。一个当前看起来像这样的协程
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()
函数的行为相同。在 Python 中使用def function(...): ...
定义函数不受影响,全局变量不能使用此语法覆盖:它也会继承当前的内置函数。(由 Victor Stinner 在 bpo-42990 中贡献。)
C API 中的更改¶
由于切换到新的 PEG 解析器,C API 函数
PyParser_SimpleParseStringFlags
、PyParser_SimpleParseStringFlagsFilename
、PyParser_SimpleParseFileFlags
、PyNode_Compile
以及这些函数使用的类型struct _node
已被删除。现在应使用例如
Py_CompileString()
将源代码直接编译为代码对象。然后可以使用例如PyEval_EvalCode()
评估生成的代码对象。具体来说
可以调用
Py_CompileString()
来替换对PyParser_SimpleParseStringFlags
的调用,后跟PyNode_Compile
。没有
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 中贡献。)
现在需要 C99 函数
snprintf()
和vsnprintf()
来构建 Python。(由 Victor Stinner 在 bpo-36020 中贡献。)sqlite3
需要 SQLite 3.7.15 或更高版本。(由 Sergey Fedoseev 和 Erlend E. Aasland 在 bpo-40744 和 bpo-40810 中贡献。)向
configure
脚本添加--disable-test-modules
选项:不构建也不安装测试模块。(由 Xavier de Gaye, Thomas Petazzoni 和 Peixing Xin 在 bpo-27640 中贡献。)向
./configure
脚本添加--with-wheel-pkg-dir=PATH 选项
。如果指定,ensurepip
模块会在该目录中查找setuptools
和pip
wheel 包:如果两者都存在,则使用这些 wheel 包,而不是 ensurepip 打包的 wheel 包。一些 Linux 发行版的打包策略建议不要捆绑依赖项。例如,Fedora 将 wheel 包安装在
/usr/share/python-wheels/
目录中,并且不安装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 的最佳实践。
新特性¶
PyNumber_Index()
的结果现在始终具有精确的类型int
。以前,结果可能是int
子类的实例。(由 Serhiy Storchaka 在 bpo-40792 中贡献。)向
PyConfig
结构添加一个新的orig_argv
成员:传递给 Python 可执行文件的原始命令行参数列表。(由 Victor Stinner 在 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 中贡献。)将
PyUnicode_AsUTF8AndSize()
添加到有限 C API 中。(由 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 中贡献。)向 C-API 添加一个新的
PySet_CheckExact()
函数,用于检查对象是否是set
的实例,但不是子类型的实例。(由 Pablo Galindo 在 bpo-43277 中贡献。)添加
PyErr_SetInterruptEx()
,它允许传递一个信号编号来模拟。(由 Antoine Pitrou 在 bpo-43356 中贡献。)如果 Python 以调试模式构建(如果定义了
Py_DEBUG
宏),现在支持有限的 C API。在有限的 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 中贡献。)
在没有持有 GIL 的情况下调用
PyDict_GetItem()
出于历史原因而被允许。 现在不再允许。(由 Victor Stinner 在 bpo-40839 中贡献。)PyUnicode_FromUnicode(NULL, size)
和PyUnicode_FromStringAndSize(NULL, size)
现在引发DeprecationWarning
。 使用PyUnicode_New()
分配没有初始数据的 Unicode 对象。(由 Inada Naoki 在 bpo-36346 中贡献。)PyCapsule API
unicodedata.ucnhash_CAPI
的私有_PyUnicode_Name_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*
字符串的Py_UNICODE_str*
函数。(由 Inada Naoki 在 bpo-41123 中贡献。)Py_UNICODE_strlen
:使用PyUnicode_GetLength()
或PyUnicode_GET_LENGTH
Py_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 已经隐式安装了信号处理程序:请参阅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 之外。从受限 C API 头文件和
python3.dll
(在 Windows 上提供稳定 ABI 的库)中移除PyOS_ReadlineFunctionPointer()
。由于该函数接受一个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 中贡献。)
为了优化 Python,
PyThreadState.use_tracing
成员已被移除。(由 Mark Shannon 在 bpo-43760 中贡献。)
3.10.7 中的重要安全功能¶
在除 2(二进制)、4、8(八进制)、16(十六进制)或 32 之外的基数(如基数 10(十进制))之间转换 int
和 str
时,如果字符串形式的位数超过限制,现在会引发 ValueError
,以避免由于算法复杂性而导致潜在的拒绝服务攻击。这是对 CVE 2020-10735 的缓解措施。此限制可以通过环境变量、命令行标志或 sys
API 进行配置或禁用。请参阅 整数字符串转换长度限制 文档。字符串形式的默认限制为 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 中贡献。)