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 中貢獻。)