Python 3.12 中的新特性¶
- 編輯:
Adam Turner
本文解釋了 Python 3.12 相對於 3.11 的新功能。Python 3.12 於 2023 年 10 月 2 日釋出。有關完整詳細資訊,請參閱更新日誌。
參見
PEP 693 – Python 3.12 釋出日程
摘要 – 釋出亮點¶
Python 3.12 是 Python 程式語言的一個穩定版本,其中包含對語言和標準庫的各種更改。庫的更改側重於清理已棄用的 API、可用性和正確性。值得注意的是,distutils 包已從標準庫中刪除。os 和 pathlib 中的檔案系統支援有許多改進,並且有幾個模組的效能更好。
語言的更改側重於可用性,因為 f-strings 已刪除了許多限制,“你的意思是……”建議也持續改進。新的型別引數語法和 type 語句改善了與靜態型別檢查器一起使用泛型型別和類型別名的人機工程學。
本文不試圖提供所有新功能的完整規範,而是提供一個方便的概述。有關完整詳細資訊,您應參閱文件,例如庫參考和語言參考。如果您想了解更改的完整實現和設計原理,請參閱特定新功能的 PEP;但請注意,一旦功能完全實現,PEP 通常不會保持最新。
新語法功能
新語法特性
直譯器的改進
PEP 669,低影響監控
Python 資料模型改進
標準庫的重大改進
pathlib.Path類現在支援子類化os模組在 Windows 支援方面獲得了一些改進針對
執行時可檢查協議的isinstance()檢查速度提高了兩到二十倍asyncio包進行了一些效能改進,一些基準測試顯示速度提高了 75%。
安全改進
將內建
hashlib的 SHA1、SHA3、SHA2-384、SHA2-512 和 MD5 實現替換為來自 HACL* 專案的經過形式驗證的程式碼。這些內建實現仍作為僅當 OpenSSL 不提供時才使用的回退。
C API 的改進
CPython 實現改進
PEP 709,推導式內聯
Linux
perf分析器CPython 支援在支援的平臺上實現棧溢位保護
新的型別特性
重要棄用、刪除或限制
PEP 623:從 Python 的 C API 中的 Unicode 物件中刪除
wstr,將每個str物件的大小至少減少 8 位元組。PEP 632:刪除
distutils包。有關替換其提供的 API 的建議,請參閱遷移指南。如果您在 Python 3.12 及更高版本中仍然需要distutils,第三方 Setuptools 包會繼續提供它。gh-95299:不要在用
venv建立的虛擬環境中預安裝setuptools。這意味著distutils、setuptools、pkg_resources和easy_install將不再預設可用;要訪問這些,請在已啟用的虛擬環境中執行pip install setuptools。asynchat、asyncore和imp模組已刪除,以及幾個unittest.TestCase方法別名。
新功能¶
PEP 695:型別引數語法¶
PEP 484 下的泛型類和函式使用冗長的語法宣告,使得型別引數的範圍不明確,並需要顯式宣告方差。
PEP 695 引入了一種新的、更緊湊和明確的方式來建立泛型類和函式
def max[T](args: Iterable[T]) -> T:
...
class list[T]:
def __getitem__(self, index: int, /) -> T:
...
def append(self, element: T) -> None:
...
此外,PEP 引入了一種使用 type 語句宣告類型別名的新方式,它建立了一個 TypeAliasType 例項
type Point = tuple[float, float]
類型別名也可以是泛型的
type Point[T] = tuple[T, T]
新語法允許宣告 TypeVarTuple 和 ParamSpec 引數,以及帶有限制或約束的 TypeVar 引數
type IntFunc[**P] = Callable[P, int] # ParamSpec
type LabeledTuple[*Ts] = tuple[str, *Ts] # TypeVarTuple
type HashableSequence[T: Hashable] = Sequence[T] # TypeVar with bound
type IntOrStrSequence[T: (int, str)] = Sequence[T] # TypeVar with constraints
透過此語法建立的類型別名的值以及型別變數的界限和約束僅在需要時進行評估(請參閱惰性評估)。這意味著類型別名可以引用檔案中稍後定義的其他型別。
透過型別引數列表宣告的型別引數在聲明範圍和任何巢狀範圍中可見,但在外部範圍中不可見。例如,它們可以用於泛型類的方法的型別註釋或類體中。但是,它們不能在類定義後在模組範圍中使用。有關型別引數執行時語義的詳細說明,請參閱型別引數列表。
為了支援這些作用域語義,引入了一種新的作用域,即註釋作用域。註釋作用域在大多數情況下表現得像函式作用域,但與封閉的類作用域的互動方式不同。在 Python 3.13 中,註釋也將透過註釋作用域進行評估。
有關更多詳細資訊,請參閱PEP 695。
(PEP 由 Eric Traut 撰寫。由 Jelle Zijlstra、Eric Traut 和其他人實現在 gh-103764 中。)
PEP 701:f-string 的句法形式化¶
PEP 701 解除了一些對 f-strings 使用的限制。f-string 內的表示式元件現在可以是任何有效的 Python 表示式,包括重用與包含 f-string 相同引號的字串、多行表示式、註釋、反斜槓和 Unicode 轉義序列。讓我們詳細介紹這些內容
引號重用:在 Python 3.11 中,重用與包含 f-string 相同的引號會引發
SyntaxError,強制使用者使用其他可用引號(例如,如果 f-string 使用單引號,則使用雙引號或三引號)。在 Python 3.12 中,您現在可以執行以下操作>>> songs = ['Take me back to Eden', 'Alkaline', 'Ascensionism'] >>> f"This is the playlist: {", ".join(songs)}" 'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'
請注意,在此更改之前,f-string 的巢狀方式沒有明確限制,但字串引號不能在 f-string 的表示式元件內重用這一事實使得任意巢狀 f-string 變得不可能。實際上,這是可以編寫的最深層巢狀的 f-string
>>> f"""{f'''{f'{f"{1+1}"}'}'''}""" '2'
由於現在 f-string 可以在表示式元件內包含任何有效的 Python 表示式,因此現在可以任意巢狀 f-string
>>> f"{f"{f"{f"{f"{f"{1+1}"}"}"}"}"}" '2'
多行表示式和註釋:在 Python 3.11 中,f-string 表示式必須定義在單行中,即使 f-string 中的表示式通常可以跨多行(例如,在多行上定義的字面量列表),這使得它們更難閱讀。在 Python 3.12 中,您現在可以定義跨多行的 f-string,並新增行內註釋
>>> f"This is the playlist: {", ".join([ ... 'Take me back to Eden', # My, my, those eyes like fire ... 'Alkaline', # Not acid nor alkaline ... 'Ascensionism' # Take to the broken skies at last ... ])}" 'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'反斜槓和 Unicode 字元:在 Python 3.12 之前,f-string 表示式不能包含任何
\字元。這也影響了 Unicode 轉義序列(例如\N{snowman}),因為這些序列包含以前不能成為 f-string 表示式元件一部分的\N部分。現在,您可以定義如下表達式>>> print(f"This is the playlist: {"\n".join(songs)}") This is the playlist: Take me back to Eden Alkaline Ascensionism >>> print(f"This is the playlist: {"\N{BLACK HEART SUIT}".join(songs)}") This is the playlist: Take me back to Eden♥Alkaline♥Ascensionism
有關更多詳細資訊,請參閱PEP 701。
由於此功能實現方式的積極副作用(透過使用PEG 解析器解析 f-strings),現在 f-string 的錯誤訊息更精確,幷包含錯誤的精確位置。例如,在 Python 3.11 中,以下 f-string 會引發 SyntaxError
>>> my_string = f"{x z y}" + f"{1 + 1}"
File "<stdin>", line 1
(x z y)
^^^
SyntaxError: f-string: invalid syntax. Perhaps you forgot a comma?
但是錯誤訊息不包含行內錯誤的精確位置,並且表示式被人為地用括號括起來。在 Python 3.12 中,由於 f-strings 是用 PEG 解析器解析的,錯誤訊息可以更精確並顯示整行
>>> my_string = f"{x z y}" + f"{1 + 1}"
File "<stdin>", line 1
my_string = f"{x z y}" + f"{1 + 1}"
^^^
SyntaxError: invalid syntax. Perhaps you forgot a comma?
(由 Pablo Galindo、Batuhan Taskaya、Lysandros Nikolaou、Cristián Maureira-Fredes 和 Marta Gómez 在 gh-102856 中貢獻。PEP 由 Pablo Galindo、Batuhan Taskaya、Lysandros Nikolaou 和 Marta Gómez 撰寫)。
PEP 684:每個直譯器一個 GIL¶
PEP 684 引入了每個直譯器一個 GIL,因此子直譯器現在可以為每個直譯器建立唯一的 GIL。這允許 Python 程式充分利用多個 CPU 核心。目前這僅透過 C-API 提供,儘管 預計 3.13 將提供 Python API。
使用新的 Py_NewInterpreterFromConfig() 函式建立具有自己 GIL 的直譯器
PyInterpreterConfig config = {
.check_multi_interp_extensions = 1,
.gil = PyInterpreterConfig_OWN_GIL,
};
PyThreadState *tstate = NULL;
PyStatus status = Py_NewInterpreterFromConfig(&tstate, &config);
if (PyStatus_Exception(status)) {
return -1;
}
/* The new interpreter is now active in the current thread. */
有關如何將 C-API 用於具有每個直譯器 GIL 的子直譯器的更多示例,請參閱 Modules/_xxsubinterpretersmodule.c。
(由 Eric Snow 在 gh-104210 等貢獻。)
PEP 669:CPython 的低影響監控¶
PEP 669 定義了一個新的 API,用於分析器、偵錯程式和其他工具來監控 CPython 中的事件。它涵蓋了廣泛的事件,包括呼叫、返回、行、異常、跳轉等等。這意味著您只為所使用的內容付費,為幾乎零開銷的偵錯程式和覆蓋工具提供了支援。有關詳細資訊,請參閱 sys.monitoring。
(由 Mark Shannon 在 gh-103082 中貢獻。)
PEP 688:在 Python 中訪問緩衝區協議¶
PEP 688 引入了一種從 Python 程式碼中使用緩衝區協議的方法。實現了 __buffer__() 方法的類現在可以用作緩衝區型別。
新的 collections.abc.Buffer 抽象基類提供了一種表示緩衝區物件的標準方式,例如在型別註釋中。新的 inspect.BufferFlags 列舉表示可用於自定義緩衝區建立的標誌。(由 Jelle Zijlstra 在 gh-102500 中貢獻。)
PEP 709:推導式內聯¶
字典、列表和集合推導式現在是內聯的,而不是為每次執行推導式建立一個新的單用途函式物件。這使得推導式的執行速度提高了兩倍。有關更多詳細資訊,請參閱PEP 709。
推導式迭代變數保持隔離,不會覆蓋外部範圍中同名變數,也不會在推導式之後可見。內聯確實導致了一些可見的行為更改
回溯中不再有單獨的推導式幀,並且跟蹤/剖析不再將推導式顯示為函式呼叫。
symtable模組將不再為每個推導式生成子符號表;相反,推導式的區域性變數將包含在父函式的符號表中。在推導式內部呼叫
locals()現在包含推導式外部的變數,並且不再包含推導式“引數”的合成.0變數。在跟蹤下執行(例如程式碼覆蓋率測量)時,直接迭代
locals()的推導式(例如[k for k in locals()])可能會看到“RuntimeError: dictionary changed size during iteration”。這與在例如for k in locals():中已看到行為相同。為避免錯誤,首先建立一個要迭代的鍵列表:keys = list(locals()); [k for k in keys]。
(由 Carl Meyer 和 Vladimir Matveev 在PEP 709 中貢獻。)
改進的錯誤訊息¶
當
NameError異常提升到頂層時,直譯器顯示的錯誤訊息現在可能會建議標準庫中的模組。(由 Pablo Galindo 在 gh-98254 中貢獻。)>>> sys.version_info Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'sys' is not defined. Did you forget to import 'sys'?
改進例項的
NameError異常的錯誤建議。現在,如果在方法中引發NameError並且例項具有與異常中名稱完全相同的屬性,則建議將包含self.<NAME>,而不是方法作用域中最接近的匹配項。(由 Pablo Galindo 在 gh-99139 中貢獻。)>>> class A: ... def __init__(self): ... self.blech = 1 ... ... def foo(self): ... somethin = blech ... >>> A().foo() Traceback (most recent call last): File "<stdin>", line 1 somethin = blech ^^^^^ NameError: name 'blech' is not defined. Did you mean: 'self.blech'?
改進當用戶輸入
import x from y而不是from y import x時SyntaxError錯誤訊息。(由 Pablo Galindo 在 gh-98931 中貢獻。)>>> import a.y.z from b.y.z Traceback (most recent call last): File "<stdin>", line 1 import a.y.z from b.y.z ^^^^^^^^^^^^^^^^^^^^^^^ SyntaxError: Did you mean to use 'from ... import ...' instead?
從失敗的
from <module> import <name>語句引發的ImportError異常現在包含基於<module>中可用名稱的<name>值建議。(由 Pablo Galindo 在 gh-91058 中貢獻。)>>> from collections import chainmap Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: cannot import name 'chainmap' from 'collections'. Did you mean: 'ChainMap'?
其他語言更改¶
解析器在解析包含空位元組的原始碼時現在會引發
SyntaxError。(由 Pablo Galindo 在 gh-96670 中貢獻。)反斜槓字元對不是有效的轉義序列時,現在會生成
SyntaxWarning,而不是DeprecationWarning。例如,re.compile("\d+\.\d+")現在會發出SyntaxWarning("\d"是一個無效的轉義序列,對正則表示式使用原始字串:re.compile(r"\d+\.\d+"))。在未來的 Python 版本中,最終將引發SyntaxError,而不是SyntaxWarning。(由 Victor Stinner 在 gh-98401 中貢獻。)在 Python 3.11 中已棄用的大於
0o377的八進位制轉義(例如:"\477"),現在會生成SyntaxWarning,而不是DeprecationWarning。在未來的 Python 版本中,它們最終將成為SyntaxError。(由 Victor Stinner 在 gh-98401 中貢獻。)在推導式目標部分中使用的、未儲存到變數現在可以在賦值表示式 (
:=) 中使用。例如,在[(b := 1) for a, b.prop in some_iter]中,現在允許對b進行賦值。請注意,根據PEP 572,仍然不允許對推導式目標部分中儲存到變數(例如a)進行賦值。(由 Nikita Sobolev 在 gh-100581 中貢獻。)在類或型別的
__set_name__方法中引發的異常不再被RuntimeError包裝。上下文資訊作為PEP 678 註釋新增到異常中。(由 Irit Katriel 在 gh-77757 中貢獻。)當
try-except*結構處理整個ExceptionGroup並引發另一個異常時,該異常不再包裝在ExceptionGroup中。3.11.4 版本也已更改。(由 Irit Katriel 在 gh-103590 中貢獻。)垃圾回收器現在僅在 Python 位元組碼評估迴圈的評估斷路器機制上執行,而不是物件分配。GC 也可以在呼叫
PyErr_CheckSignals()時執行,因此需要長時間執行而無需執行任何 Python 程式碼的 C 擴充套件也有機會定期執行 GC。(由 Pablo Galindo 在 gh-97922 中貢獻。)所有預期布林引數的內建和擴充套件可呼叫物件現在接受任何型別的引數,而不僅僅是
bool和int。(由 Serhiy Storchaka 在 gh-60203 中貢獻。)memoryview現在支援半浮點型別(“e”格式程式碼)。(由 Donghee Na 和 Antoine Pitrou 在 gh-90751 中貢獻。)slice物件現在是可雜湊的,允許它們用作字典鍵和集合項。(由 Will Bradshaw、Furkan Onder 和 Raymond Hettinger 在 gh-101264 中貢獻。)sum()現在使用 Neumaier 求和法來提高浮點數或混合整數和浮點數求和時的精度和可交換性。(由 Raymond Hettinger 在 gh-100425 中貢獻。)ast.parse()在解析包含空位元組的原始碼時現在引發SyntaxError而不是ValueError。(由 Pablo Galindo 在 gh-96670 中貢獻。)tarfile中的提取方法和shutil.unpack_archive()具有新的 filter 引數,允許限制可能令人驚訝或危險的 tar 功能,例如在目標目錄外部建立檔案。有關詳細資訊,請參閱tarfile 提取過濾器。在 Python 3.14 中,預設值將切換為'data'。(由 Petr Viktorin 在PEP 706 中貢獻。)如果底層對映是可雜湊的,則
types.MappingProxyType例項現在是可雜湊的。(由 Serhiy Storchaka 在 gh-87995 中貢獻。)透過新的環境變數
PYTHONPERFSUPPORT和命令列選項-X perf,以及新的sys.activate_stack_trampoline()、sys.deactivate_stack_trampoline()和sys.is_stack_trampoline_active()函式,增加了對 perf 分析器的支援。(由 Pablo Galindo 設計。由 Pablo Galindo 和 Christian Heimes 貢獻,並得到 Gregory P. Smith [Google] 和 Mark Shannon 在 gh-96123 中的貢獻。)
新模組¶
無。
改進的模組¶
array¶
array.array類現在支援下標,使其成為泛型型別。(由 Jelle Zijlstra 在 gh-98658 中貢獻。)
asyncio¶
asyncio中寫入套接字的效能顯著提高。asyncio現在在寫入套接字時避免不必要的複製,如果平臺支援,則使用sendmsg()。(由 Kumar Aditya 在 gh-91166 中貢獻。)新增
asyncio.eager_task_factory()和asyncio.create_eager_task_factory()函式,以允許事件迴圈選擇啟用渴望任務執行,從而使某些用例速度提高 2 到 5 倍。(由 Jacob Bower & Itamar Oren 在 gh-102853、gh-104140 和 gh-104138 中貢獻)在 Linux 上,如果
os.pidfd_open()可用且功能正常,asyncio預設使用asyncio.PidfdChildWatcher,而不是asyncio.ThreadedChildWatcher。(由 Kumar Aditya 在 gh-98024 中貢獻。)事件迴圈現在為每個平臺使用最佳可用的子觀察者(如果支援則為
asyncio.PidfdChildWatcher,否則為asyncio.ThreadedChildWatcher),因此不建議手動配置子觀察者。(由 Kumar Aditya 在 gh-94597 中貢獻。)向
asyncio.run()新增 loop_factory 引數,允許指定自定義事件迴圈工廠。(由 Kumar Aditya 在 gh-99388 中貢獻。)新增
asyncio.current_task()的 C 實現,速度提高了 4-6 倍。(由 Itamar Oren 和 Pranav Thulasiram Bhat 在 gh-100344 中貢獻。)asyncio.iscoroutine()現在對生成器返回False,因為asyncio不支援舊的基於生成器的協程。(由 Kumar Aditya 在 gh-102748 中貢獻。)asyncio.wait()和asyncio.as_completed()現在接受生成任務的生成器。(由 Kumar Aditya 在 gh-78530 中貢獻。)
calendar¶
新增列舉
calendar.Month和calendar.Day,定義一年中的月份和一週中的日子。(由 Prince Roshan 在 gh-103636 中貢獻。)
csv¶
新增
csv.QUOTE_NOTNULL和csv.QUOTE_STRINGS標誌,以提供對reader和writer物件的None和空字串的更細粒度控制。
dis¶
偽指令操作碼(編譯器使用但不會出現在可執行位元組碼中)現在在
dis模組中公開。HAVE_ARGUMENT仍然與真實操作碼相關,但對偽指令無用。請改用新的dis.hasarg集合。(由 Irit Katriel 在 gh-94216 中貢獻。)新增
dis.hasexc集合以表示設定異常處理程式的指令。(由 Irit Katriel 在 gh-94216 中貢獻。)
fractions¶
fractions.Fraction型別的物件現在支援浮點風格的格式化。(由 Mark Dickinson 在 gh-100161 中貢獻。)
importlib.resources¶
importlib.resources.as_file()現在支援資源目錄。(由 Jason R. Coombs 在 gh-97930 中貢獻。)將
importlib.resources.files()的第一個引數重新命名為 anchor。(由 Jason R. Coombs 在 gh-100598 中貢獻。)
inspect¶
新增
inspect.markcoroutinefunction()以標記返回 協程 的同步函式,以與inspect.iscoroutinefunction()一起使用。(由 Carlton Gibson 在 gh-99247 中貢獻。)新增
inspect.getasyncgenstate()和inspect.getasyncgenlocals(),用於確定非同步生成器的當前狀態。(由 Thomas Krennwallner 在 gh-79940 中貢獻。)inspect.getattr_static()的效能得到了顯著提高。大多數對該函式的呼叫應該比 Python 3.11 中至少快兩倍。(由 Alex Waygood 在 gh-103193 中貢獻。)
itertools¶
新增
itertools.batched(),用於收集等長元組,其中最後一批可能比其餘的短。(由 Raymond Hettinger 在 gh-98363 中貢獻。)
math¶
新增
math.sumprod()以計算乘積之和。(由 Raymond Hettinger 在 gh-100485 中貢獻。)擴充套件
math.nextafter()以包含 steps 引數,用於一次向上或向下移動多個步長。(由 Matthias Goergens、Mark Dickinson 和 Raymond Hettinger 在 gh-94906 中貢獻。)
os¶
新增
os.PIDFD_NONBLOCK以在非阻塞模式下使用os.pidfd_open()為程序開啟檔案描述符。(由 Kumar Aditya 在 gh-93312 中貢獻。)os.DirEntry現在包含一個os.DirEntry.is_junction()方法來檢查條目是否為連線點。(由 Charles Machalow 在 gh-99547 中貢獻。)在 Windows 上新增
os.listdrives()、os.listvolumes()和os.listmounts()函式,用於列舉驅動器、卷和掛載點。(由 Steve Dower 在 gh-102519 中貢獻。)os.stat()和os.lstat()在 Windows 上現在更準確。st_birthtime欄位現在將填充檔案的建立時間,並且st_ctime已棄用但仍包含建立時間(但在未來將返回最後一次元資料更改,以便與其他平臺保持一致)。st_dev最多可以是 64 位,st_ino最多可以是 128 位,具體取決於您的檔案系統,並且st_rdev始終設定為零而不是不正確的值。這兩個函式在 Windows 的新版本上可能顯著更快。(由 Steve Dower 在 gh-99726 中貢獻。)
os.path¶
新增
os.path.isjunction()以檢查給定路徑是否為連線點。(由 Charles Machalow 在 gh-99547 中貢獻。)新增
os.path.splitroot()以將路徑拆分為三元組(drive, root, tail)。(由 Barney Gale 在 gh-101000 中貢獻。)
pathlib¶
增加了對
pathlib.PurePath和pathlib.Path以及它們的 Posix 和 Windows 特定變體的子類化支援。子類可以重寫pathlib.PurePath.with_segments()方法以在路徑例項之間傳遞資訊。新增
pathlib.Path.walk(),用於遍歷目錄樹並生成其中所有檔案或目錄名稱,類似於os.walk()。(由 Stanislav Zmiev 在 gh-90385 中貢獻。)在
pathlib.PurePath.relative_to()中添加了 walk_up 可選引數,以允許在結果中插入..條目;此行為與os.path.relpath()更一致。(由 Domenico Ragusa 在 gh-84538 中貢獻。)新增
pathlib.Path.is_junction()作為os.path.isjunction()的代理。(由 Charles Machalow 在 gh-99547 中貢獻。)向
pathlib.Path.glob()、pathlib.Path.rglob()和pathlib.PurePath.match()新增 case_sensitive 可選引數,用於匹配路徑的大小寫敏感性,從而更精確地控制匹配過程。
platform¶
增加對檢測 Windows 11 和 Windows Server 2012 以後版本的支援。此前,在 Windows Server 2012 以後和 Windows 11 上的查詢會返回
Windows-10。(由 Steve Dower 在 gh-89545 中貢獻。)
pdb¶
新增方便變數以在除錯會話中臨時儲存值,並提供對當前幀或返回值等值的快速訪問。(由 Tian Gao 在 gh-103693 中貢獻。)
random¶
新增
random.binomialvariate()。(由 Raymond Hettinger 在 gh-81620 中貢獻。)將
lambd=1.0新增為random.expovariate()的預設值。(由 Raymond Hettinger 在 gh-100234 中貢獻。)
shutil¶
shutil.make_archive()現在將 root_dir 引數傳遞給支援它的自定義歸檔器。在這種情況下,它不再暫時更改程序的當前工作目錄到 root_dir 來執行歸檔。(由 Serhiy Storchaka 在 gh-74696 中貢獻。)shutil.rmtree()現在接受一個新的引數 onexc,它是一個錯誤處理程式,類似於 onerror,但它期望一個異常例項而不是 (typ, val, tb) 三元組。onerror 已棄用。(由 Irit Katriel 在 gh-102828 中貢獻。)shutil.which()現在會查閱 PATHEXT 環境變數,即使給定的 cmd 包含目錄元件,也會在 Windows 上的 PATH 中查詢匹配項。(由 Charles Machalow 在 gh-103179 中貢獻。)shutil.which()在查詢 Windows 上的可執行檔案時將呼叫NeedCurrentDirectoryForExePathW,以確定當前工作目錄是否應新增到搜尋路徑中。(由 Charles Machalow 在 gh-103179 中貢獻。)shutil.which()將返回與 cmd 匹配的路徑,該路徑在 Windows 上的搜尋路徑中,PATHEXT中的元件優先於其他地方的直接匹配。(由 Charles Machalow 在 gh-103179 中貢獻。)
sqlite3¶
將
sqlite3.Connection.autocommit屬性新增到sqlite3.Connection,並將 autocommit 引數新增到sqlite3.connect(),以控制符合PEP 249 的事務處理。(由 Erlend E. Aasland 在 gh-83638 中貢獻。)向
sqlite3.Connection.load_extension()新增 entrypoint 僅關鍵字引數,用於覆蓋 SQLite 擴充套件入口點。(由 Erlend E. Aasland 在 gh-103015 中貢獻。)向
sqlite3.Connection新增sqlite3.Connection.getconfig()和sqlite3.Connection.setconfig(),以更改資料庫連線的配置。(由 Erlend E. Aasland 在 gh-103489 中貢獻。)
statistics¶
擴充套件
statistics.correlation()以包含ranked方法,用於計算等級資料的 Spearman 相關性。(由 Raymond Hettinger 在 gh-95861 中貢獻。)
sys¶
新增
sys.monitoring名稱空間以公開新的 PEP 669 監控 API。(由 Mark Shannon 在 gh-103082 中貢獻。)新增
sys.activate_stack_trampoline()和sys.deactivate_stack_trampoline()用於啟用和停用堆疊分析器跳轉,以及sys.is_stack_trampoline_active()用於查詢堆疊分析器跳轉是否處於活動狀態。(由 Pablo Galindo 和 Christian Heimes 貢獻,並得到 Gregory P. Smith [Google] 和 Mark Shannon 在 gh-96123 中的貢獻。)新增
sys.last_exc,它儲存最後一次未處理的異常(用於事後除錯用例)。棄用其舊版本中包含相同資訊的三個欄位:sys.last_type、sys.last_value和sys.last_traceback。(由 Irit Katriel 在 gh-102778 中貢獻。)sys._current_exceptions()現在返回從執行緒 ID 到異常例項的對映,而不是到(typ, exc, tb)元組的對映。(由 Irit Katriel 在 gh-103176 中貢獻。)sys.setrecursionlimit()和sys.getrecursionlimit()。遞迴限制現在僅適用於 Python 程式碼。內建函式不使用遞迴限制,但受不同的機制保護,該機制可防止遞迴導致虛擬機器崩潰。
tempfile¶
tempfile.NamedTemporaryFile函式新增了一個可選引數 delete_on_close (由 Evgeny Zorin 在 gh-58451 貢獻)。tempfile.mkdtemp()現在總是返回一個絕對路徑,即使提供給 dir 引數的實參是一個相對路徑。
threading¶
添加了
threading.settrace_all_threads()和threading.setprofile_all_threads(),它們允許在所有執行的執行緒(除了呼叫執行緒)中設定追蹤和效能分析函式。(由 Pablo Galindo 在 gh-93503 貢獻)。
tkinter¶
tkinter.Canvas.coords()現在會展平其引數。它現在不僅接受獨立的座標(x1, y1, x2, y2, ...)和座標序列([x1, y1, x2, y2, ...]),還接受成對分組的座標((x1, y1), (x2, y2), ...和[(x1, y1), (x2, y2), ...]),就像create_*()方法一樣。(由 Serhiy Storchaka 在 gh-94473 貢獻)。
tokenize¶
tokenize模組包含了 PEP 701 中引入的更改。(由 Marta Gómez Macías 和 Pablo Galindo 在 gh-102856 貢獻)。有關tokenize模組更改的更多資訊,請參閱 移植到 Python 3.12。
types¶
添加了
types.get_original_bases(),以允許在子類化時對 使用者定義泛型型別 進行進一步的內省。(由 James Hilton-Balfe 和 Alex Waygood 在 gh-101827 貢獻)。
typing¶
isinstance()對runtime-checkable protocols的檢查現在使用inspect.getattr_static()而不是hasattr()來查詢屬性是否存在。這意味著描述符和__getattr__()方法在對可執行時檢查協議進行isinstance()檢查時不再意外求值。然而,這也可能意味著一些過去被認為是可執行時檢查協議例項的物件,在 Python 3.12+ 中可能不再被認為是該協議的例項,反之亦然。大多數使用者不太可能受到此更改的影響。(由 Alex Waygood 在 gh-102433 貢獻)。可執行時檢查協議的成員現在在類建立後立即被視為“凍結”。修補可執行時檢查協議上的屬性仍然有效,但對比較物件與協議的
isinstance()檢查沒有影響。例如:>>> from typing import Protocol, runtime_checkable >>> @runtime_checkable ... class HasX(Protocol): ... x = 1 ... >>> class Foo: ... ... >>> f = Foo() >>> isinstance(f, HasX) False >>> f.x = 1 >>> isinstance(f, HasX) True >>> HasX.y = 2 >>> isinstance(f, HasX) # unchanged, even though HasX now also has a "y" attribute True
此更改是為了加快對可執行時檢查協議的
isinstance()檢查。對
runtime-checkable protocols的isinstance()檢查的效能配置檔案已顯著改變。大多數對只有少數成員的協議的isinstance()檢查應該比 3.11 快至少 2 倍,有些可能快 20 倍或更多。然而,對具有許多成員的協議的isinstance()檢查可能比 Python 3.11 慢。(由 Alex Waygood 在 gh-74690 和 gh-103193 貢獻)。所有
typing.TypedDict和typing.NamedTuple類現在都具有__orig_bases__屬性。(由 Adrian Garcia Badaracco 在 gh-103699 貢獻)。向
typing.dataclass_transform()添加了frozen_default引數。(由 Erik De Bonte 在 gh-99957 貢獻)。
unicodedata¶
Unicode 資料庫已更新至版本 15.0.0。(由 Benjamin Peterson 在 gh-96734 貢獻)。
unittest¶
添加了 --durations 命令列選項,顯示 N 個最慢的測試用例。
python3 -m unittest --durations=3 lib.tests.test_threading
.....
Slowest test durations
----------------------------------------------------------------------
1.210s test_timeout (Lib.test.test_threading.BarrierTests)
1.003s test_default_timeout (Lib.test.test_threading.BarrierTests)
0.518s test_timeout (Lib.test.test_threading.EventTests)
(0.000 durations hidden. Use -v to show these durations.)
----------------------------------------------------------------------
Ran 158 tests in 9.869s
OK (skipped=3)
(由 Giampaolo Rodola 在 gh-48330 貢獻)
uuid¶
最佳化¶
從 Unicode 物件中移除了
wstr和wstr_length成員。這在 64 位平臺上減少了 8 或 16 位元組的物件大小。( PEP 623) (由 Inada Naoki 在 gh-92536 貢獻)。添加了在構建過程中使用 BOLT 二進位制最佳化器的實驗性支援,這可將效能提高 1-5%。(由 Kevin Modzelewski 在 gh-90536 貢獻,由 Donghee Na 在 gh-101525 調優)
對於包含組引用的替換字串,正則表示式替換(函式
re.sub()和re.subn()以及相應的re.Pattern方法)的速度提高了 2-3 倍。(由 Serhiy Storchaka 在 gh-91524 貢獻)。透過延遲昂貴的字串格式化,加快了
asyncio.Task的建立。(由 Itamar Oren 在 gh-103793 貢獻)。作為
tokenize模組中覆蓋 PEP 701 所需更改的副作用,tokenize.tokenize()和tokenize.generate_tokens()函式的速度提高了 64%。(由 Marta Gómez Macías 和 Pablo Galindo 在 gh-102856 貢獻)。透過新的
LOAD_SUPER_ATTR指令,加快了super()方法呼叫和屬性載入。(由 Carl Meyer 和 Vladimir Matveev 在 gh-103497 貢獻)。
CPython 位元組碼變更¶
移除了
LOAD_METHOD指令。它已合併到LOAD_ATTR中。LOAD_ATTR現在將像舊的LOAD_METHOD指令一樣執行,如果其操作碼的低位設定了的話。(由 Ken Jin 在 gh-93429 貢獻)。移除了
JUMP_IF_FALSE_OR_POP和JUMP_IF_TRUE_OR_POP指令。(由 Irit Katriel 在 gh-102859 貢獻)。移除了
PRECALL指令。(由 Mark Shannon 在 gh-92925 貢獻)。添加了
BINARY_SLICE和STORE_SLICE指令。(由 Mark Shannon 在 gh-94163 貢獻)。添加了
CALL_INTRINSIC_1指令。(由 Mark Shannon 在 gh-99005 貢獻)。添加了
CALL_INTRINSIC_2指令。(由 Irit Katriel 在 gh-101799 貢獻)。添加了
CLEANUP_THROW指令。(由 Brandt Bucher 在 gh-90997 貢獻)。添加了
END_SEND指令。(由 Mark Shannon 在 gh-103082 貢獻)。添加了
LOAD_FAST_AND_CLEAR指令,作為 PEP 709 實現的一部分。(由 Carl Meyer 在 gh-101441 貢獻)。添加了
LOAD_FAST_CHECK指令。(由 Dennis Sweeney 在 gh-93143 貢獻)。添加了
LOAD_FROM_DICT_OR_DEREF、LOAD_FROM_DICT_OR_GLOBALS和LOAD_LOCALS操作碼,作為 PEP 695 實現的一部分。移除了LOAD_CLASSDEREF操作碼,它可以用LOAD_LOCALS加LOAD_FROM_DICT_OR_DEREF替換。(由 Jelle Zijlstra 在 gh-103764 貢獻)。添加了
LOAD_SUPER_ATTR指令。(由 Carl Meyer 和 Vladimir Matveev 在 gh-103497 貢獻)。添加了
RETURN_CONST指令。(由 Wenyang Wang 在 gh-101632 貢獻)。
演示和工具¶
移除了包含舊演示指令碼的
Tools/demo/目錄。可以在 old-demos 專案 中找到副本。(由 Victor Stinner 在 gh-97681 貢獻)。移除了
Tools/scripts/目錄中過時的示例指令碼。可以在 old-demos 專案 中找到副本。(由 Victor Stinner 在 gh-97669 貢獻)。
已棄用¶
argparse:argparse.BooleanOptionalAction的 type、choices 和 metavar 引數已棄用,並將在 3.14 中移除。(由 Nikita Sobolev 在 gh-92248 貢獻)。ast:以下ast功能自 Python 3.8 起已在文件中棄用,現在在執行時訪問或使用時會發出DeprecationWarning,並將在 Python 3.14 中移除:ast.Numast.Strast.Bytesast.NameConstantast.Ellipsis
請改用
ast.Constant。(由 Serhiy Storchaka 在 gh-90953 貢獻)。-
子程序觀察器類
asyncio.MultiLoopChildWatcher、asyncio.FastChildWatcher、asyncio.AbstractChildWatcher和asyncio.SafeChildWatcher已棄用,並將在 Python 3.14 中移除。(由 Kumar Aditya 在 gh-94597 貢獻)。asyncio.set_child_watcher()、asyncio.get_child_watcher()、asyncio.AbstractEventLoopPolicy.set_child_watcher()和asyncio.AbstractEventLoopPolicy.get_child_watcher()已棄用,並將在 Python 3.14 中移除。(由 Kumar Aditya 在 gh-94597 貢獻)。如果未設定當前事件迴圈,並且預設事件迴圈策略的
get_event_loop()方法決定建立一個事件迴圈,它現在會發出DeprecationWarning。(由 Serhiy Storchaka 和 Guido van Rossum 在 gh-100160 貢獻)。
calendar:calendar.January和calendar.February常量已棄用,並由calendar.JANUARY和calendar.FEBRUARY替換。(由 Prince Roshan 在 gh-103636 貢獻)。collections.abc:collections.abc.ByteString已棄用。要測試
obj是否在執行時實現了緩衝區協議,請使用isinstance(obj, collections.abc.Buffer)。在型別註解中,請使用Buffer或顯式指定程式碼支援的型別的聯合型別(例如bytes | bytearray | memoryview)。ByteString最初旨在作為bytes和bytearray的超型別。然而,由於 ABC 從未有任何方法,知道一個物件是ByteString的例項實際上並不能告訴你任何關於該物件的有用資訊。其他常見的緩衝區型別,如memoryview,也從未被理解為ByteString的子型別(無論是執行時還是靜態型別檢查器)。datetime:datetime.datetime的utcnow()和utcfromtimestamp()已棄用,並將在未來版本中移除。請改用時區感知物件來表示 UTC 中的日期時間:分別呼叫now()和fromtimestamp(),並將 tz 引數設定為datetime.UTC。(由 Paul Ganssle 在 gh-103857 貢獻)。email:email.utils.localtime()中的 isdst 引數已棄用。(由 Alan Williams 在 gh-72346 貢獻)。importlib.abc:以下類已棄用,計劃在 Python 3.14 中移除:importlib.abc.ResourceReaderimportlib.abc.Traversableimportlib.abc.TraversableResources
請改用
importlib.resources.abc類:(由 Jason R. Coombs 和 Hugo van Kemenade 在 gh-93963 中貢獻。)
itertools:棄用了對複製、深複製和 pickle 操作的支援,這些操作未文件化、效率低下、歷史上存在 bug 且不一致。這將從 3.14 中移除,以顯著減少程式碼量和維護負擔。(由 Raymond Hettinger 在 gh-101588 貢獻)。multiprocessing:在 Python 3.14 中,在 Linux、BSD 和其他非 macOS POSIX 平臺上(目前預設為'fork'),multiprocessing的預設啟動方法將更改為更安全的方法 (gh-84559)。新增執行時警告被認為過於具有破壞性,因為大多數程式碼預計不會關心。使用get_context()或set_start_method()API 顯式指定您的程式碼何時 *需要*'fork'。請參閱 上下文和啟動方法。pkgutil:pkgutil.find_loader()和pkgutil.get_loader()已棄用,並將在 Python 3.14 中移除;請改用importlib.util.find_spec()。(由 Nikita Sobolev 在 gh-97850 貢獻)。pty:該模組有兩個未文件化的master_open()和slave_open()函式,自 Python 2 以來就已棄用,但在 3.12 中才獲得了適當的DeprecationWarning。將在 3.14 中移除它們。(由 Soumendra Ganguly 和 Gregory P. Smith 在 gh-85984 貢獻)。os:os.stat()和os.lstat()在 Windows 上返回的st_ctime欄位已棄用。在未來版本中,它們將包含上次元資料更改時間,與其他平臺保持一致。目前,它們仍然包含建立時間,新st_birthtime欄位中也提供了該時間。(由 Steve Dower 在 gh-99726 貢獻)。在 POSIX 平臺上,當
os.fork()從多執行緒程序呼叫時,它現在可以引發DeprecationWarning。這樣做與 POSIX 平臺一直存在根本性不相容。即使這樣的程式碼 *看起來* 有效。我們添加了警告以提高認識,因為程式碼這樣做遇到的問題變得越來越頻繁。有關更多詳細資訊,請參閱os.fork()文件,以及 此關於 fork 與執行緒不相容的討論,瞭解我們現在為何向開發人員揭示這個長期存在的平臺相容性問題。
當由於使用
multiprocessing或concurrent.futures而出現此警告時,修復方法是使用不同的multiprocessing啟動方法,例如"spawn"或"forkserver"。shutil:shutil.rmtree()的 onerror 引數已棄用;請改用 onexc。(由 Irit Katriel 在 gh-102828 貢獻)。-
預設介面卡和轉換器 現已棄用。請改用 介面卡和轉換器示例 並根據您的需求進行定製。(由 Erlend E. Aasland 在 gh-90016 貢獻)。
在
execute()中,當 命名佔位符 與作為 序列 而非dict提供的引數一起使用時,現在會發出DeprecationWarning。從 Python 3.14 開始,將命名佔位符與作為序列提供的引數一起使用將引發ProgrammingError。(由 Erlend E. Aasland 在 gh-101698 貢獻)。
sys:sys.last_type、sys.last_value和sys.last_traceback欄位已棄用。請改用sys.last_exc。(由 Irit Katriel 在 gh-102778 貢獻)。tarfile:在 Python 3.14 之前,未指定 filter 來提取 tar 歸檔檔案已棄用,屆時'data'過濾器將成為預設值。有關詳細資訊,請參閱 提取過濾器。-
typing.Hashable和typing.Sized,分別是collections.abc.Hashable和collections.abc.Sized的別名,已棄用。( gh-94309 )。typing.ByteString,自 Python 3.9 起已棄用,現在在使用時會發出DeprecationWarning。(由 Alex Waygood 在 gh-91896 貢獻)。
xml.etree.ElementTree:該模組現在在測試xml.etree.ElementTree.Element的真值時會發出DeprecationWarning。之前,Python 實現會發出FutureWarning,而 C 實現不發出任何警告。(由 Jacob Walls 在 gh-83122 貢獻)。coroutine throw()、generator throw()和async generator throw()的三引數簽名(型別、值、回溯)已棄用,並可能在 Python 的未來版本中移除。請改用這些函式的單引數版本。(由 Ofey Chan 在 gh-89874 貢獻)。當模組上的
__package__與__spec__.parent不同時,現在會引發DeprecationWarning(以前是ImportWarning)。(由 Brett Cannon 在 gh-65961 貢獻)。在模組上設定
__package__或__cached__已棄用,並且在 Python 3.14 中將不再由匯入系統設定或考慮。(由 Brett Cannon 在 gh-65961 貢獻)。對 bool 型別使用按位反轉運算子(
~)已棄用。它將在 Python 3.16 中引發錯誤。請改用not對 bool 進行邏輯非操作。在極少數情況下,如果您確實需要底層int的按位反轉,請顯式轉換為 int:~int(x)。(由 Tim Hoffmann 在 gh-103487 貢獻)。在 Python 3.10 中,透過 PEP 626 棄用了程式碼物件上的
co_lnotab訪問,但直到 3.12 才獲得了適當的DeprecationWarning。可能在 3.15 中移除。(由 Nikita Sobolev 在 gh-101866 貢獻)。
計劃在 Python 3.13 中移除¶
模組(請參閱 PEP 594)
aifcaudioopcgicgitbchunkcryptimghdrmailcapmsilibnisnntplibossaudiodevpipessndhdrspwdsunautelnetlibuuxdrlib
其他模組
lib2to3和 2to3 程式 (gh-84540)
API
configparser.LegacyInterpolation(gh-90765)locale.resetlocale()(gh-90817)turtle.RawTurtle.settiltangle()(gh-50096)unittest.findTestCases()(gh-50096)unittest.getTestCaseNames()(gh-50096)unittest.makeSuite()(gh-50096)unittest.TestProgram.usageExit()(gh-67048)webbrowser.MacOSX(gh-86421)classmethod描述符鏈 (gh-89519)importlib.resources棄用方法contents()is_resource()open_binary()open_text()path()read_binary()read_text()
請改用
importlib.resources.files()。請參閱 importlib-resources: 從舊版本遷移 (gh-106531)
計劃在 Python 3.14 中移除¶
argparse:argparse.BooleanOptionalAction的 type、choices 和 metavar 引數已棄用,並將在 3.14 中移除。(由 Nikita Sobolev 在 gh-92248 貢獻)。ast:以下功能自 Python 3.8 起已在文件中棄用,現在在執行時訪問或使用時會發出DeprecationWarning,並將在 Python 3.14 中移除:ast.Numast.Strast.Bytesast.NameConstantast.Ellipsis
請改用
ast.Constant。(由 Serhiy Storchaka 在 gh-90953 貢獻)。-
子程序觀察器類
asyncio.MultiLoopChildWatcher、asyncio.FastChildWatcher、asyncio.AbstractChildWatcher和asyncio.SafeChildWatcher已棄用,並將在 Python 3.14 中移除。(由 Kumar Aditya 在 gh-94597 貢獻)。asyncio.set_child_watcher()、asyncio.get_child_watcher()、asyncio.AbstractEventLoopPolicy.set_child_watcher()和asyncio.AbstractEventLoopPolicy.get_child_watcher()已棄用,並將在 Python 3.14 中移除。(由 Kumar Aditya 在 gh-94597 貢獻)。如果未設定當前事件迴圈,並且預設事件迴圈策略的
get_event_loop()方法決定建立一個事件迴圈,它現在會發出DeprecationWarning。(由 Serhiy Storchaka 和 Guido van Rossum 在 gh-100160 貢獻)。
email:email.utils.localtime()中的 isdst 引數已棄用。(由 Alan Williams 在 gh-72346 貢獻)。importlib.abc棄用類importlib.abc.ResourceReaderimportlib.abc.Traversableimportlib.abc.TraversableResources
請改用
importlib.resources.abc類:(由 Jason R. Coombs 和 Hugo van Kemenade 在 gh-93963 中貢獻。)
itertools對複製、深複製和 pickle 操作的支援未文件化、效率低下、歷史上存在 bug 且不一致。這將從 3.14 中移除,以顯著減少程式碼量和維護負擔。(由 Raymond Hettinger 在 gh-101588 貢獻)。multiprocessing:在 Linux、BSD 和其他非 macOS POSIX 平臺上(目前預設為'fork'),預設啟動方法將更改為更安全的方法 (gh-84559)。新增執行時警告被認為過於具有破壞性,因為大多數程式碼預計不會關心。使用get_context()或set_start_method()API 顯式指定您的程式碼何時 *需要*'fork'。請參閱 上下文和啟動方法。pathlib:is_relative_to()和relative_to():傳遞額外引數已棄用。pkgutil:pkgutil.find_loader()和pkgutil.get_loader()現在會引發DeprecationWarning;請改用importlib.util.find_spec()。(由 Nikita Sobolev 在 gh-97850 貢獻)。pty:master_open():請使用pty.openpty()。slave_open():請使用pty.openpty()。
-
version和version_info。execute()和executemany(),如果使用了 命名佔位符 並且 parameters 是一個序列而不是dict。
urllib:urllib.parse.Quoter已棄用:它無意作為公共 API。(由 Gregory P. Smith 在 gh-88168 貢獻)。
計劃在 Python 3.15 中移除¶
匯入系統
在設定模組的
__cached__屬性時,若未同時設定__spec__.cached,此行為已被棄用。在 Python 3.15 中,匯入系統或標準庫將不再設定或考慮__cached__屬性。(由 gh-97879 貢獻)在設定模組的
__package__屬性時,若未同時設定__spec__.parent,此行為已被棄用。在 Python 3.15 中,匯入系統或標準庫將不再設定或考慮__package__屬性。(由 gh-97879 貢獻)
-
未寫入文件的
ctypes.SetPointerType()函式自 Python 3.13 起已被棄用。
-
過時且很少使用的
CGIHTTPRequestHandler已從 Python 3.13 開始棄用。沒有直接的替代品。任何將 Web 伺服器與請求處理程式對接的方式都比 CGI 好。python -m http.server 命令列介面的
--cgi旗標已自 Python 3.13 起棄用。
-
load_module()方法:請改用exec_module()。
-
getdefaultlocale()函式自 Python 3.11 起已棄用。原計劃在 Python 3.13 中移除 (gh-90817),但已推遲到 Python 3.15。請改用getlocale()、setlocale()和getencoding()。(由 Hugo van Kemenade 在 gh-111187 貢獻)。
-
PurePath.is_reserved()已自 Python 3.13 起棄用。要檢測 Windows 上的保留路徑,請使用os.path.isreserved()。
-
java_ver()已自 Python 3.13 起棄用。此函式僅對 Jython 支援有用,其 API 令人困惑,且基本未經測試。
-
sysconfig.is_python_build()的 check_home 引數已自 Python 3.12 起棄用。
-
RLock()在 Python 3.15 中將不再接受任何引數。自 Python 3.14 起,傳遞任何引數的行為已被棄用,因為 Python 版本不允許任何引數,但 C 版本允許任意數量的位置或關鍵字引數,並會忽略所有引數。
-
types.CodeType:在 Python 3.10 中透過 PEP 626 棄用了co_lnotab的訪問,原計劃在 3.12 中移除,但直到 3.12 才獲得了適當的DeprecationWarning。可能在 3.15 中移除。(由 Nikita Sobolev 在 gh-101866 貢獻)。
-
用於建立
NamedTuple類的未寫入文件的關鍵字引數語法(例如,Point = NamedTuple("Point", x=int, y=int))已自 Python 3.13 起棄用。請改用基於類的語法或函式式語法。使用
TypedDict的函式式語法時,未向 fields 引數傳遞值(TD = TypedDict("TD"))或傳遞None(TD = TypedDict("TD", None))自 Python 3.13 起已棄用。請使用class TD(TypedDict): pass或TD = TypedDict("TD", {})來建立具有零欄位的 TypedDict。typing.no_type_check_decorator()裝飾器函式已自 Python 3.13 起棄用。在typing模組中存在八年後,它仍未被任何主流型別檢查器支援。
wave:Wave_read和Wave_write類的getmark()、setmark()和getmarkers()方法自 Python 3.13 起已棄用。
-
load_module()已自 Python 3.10 起棄用。請改用exec_module()。(由 Jiahao Li 在 gh-125746 中貢獻。)
計劃在 Python 3.16 中移除¶
匯入系統
在設定模組的
__loader__屬性時,若未同時設定__spec__.loader,此行為已被棄用。在 Python 3.16 中,匯入系統或標準庫將不再設定或考慮__loader__屬性。
-
'u'格式程式碼(wchar_t)自 Python 3.3 起在文件中被棄用,自 Python 3.13 起在執行時被棄用。請改用'w'格式程式碼(Py_UCS4)來處理 Unicode 字元。
-
asyncio.iscoroutinefunction()已被棄用,並將在 Python 3.16 中移除;請改用inspect.iscoroutinefunction()。(由 Jiahao Li 和 Kumar Aditya 在 gh-122875 中貢獻。)asyncio的策略系統已被棄用,並將在 Python 3.16 中移除。特別是,以下類和函式已被棄用:使用者應使用
asyncio.run()或帶 loop_factory 引數的asyncio.Runner來使用期望的事件迴圈實現。例如,在 Windows 上使用
asyncio.SelectorEventLoopimport asyncio async def main(): ... asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)
(由 Kumar Aditya 在 gh-127949 中貢獻。)
-
對布林型別進行按位取反(
~True或~False)的行為已自 Python 3.12 起棄用,因為它會產生令人驚訝且不直觀的結果(-2和-1)。要對布林值進行邏輯非運算,請改用not x。在極少數情況下,如果您需要對底層整數進行按位取反,請顯式轉換為int(~int(x))。
-
以關鍵字引數形式向
functools.reduce()的 Python 實現傳遞 function 或 sequence 引數的做法已自 Python 3.14 起棄用。
-
對帶有 strm 引數的自定義日誌處理程式的支援已被棄用,並計劃在 Python 3.16 中移除。請改用 stream 引數來定義處理程式。(由 Mariusz Felisiak 在 gh-115032 中貢獻。)
-
對於
mimetypes.MimeTypes.add_type(),有效的副檔名應以“.”開頭或是空字串。不帶點的副檔名已被棄用,並將在 Python 3.16 中引發ValueError。(由 Hugo van Kemenade 在 gh-75223 中貢獻。)
-
ExecError異常已自 Python 3.14 起棄用。自 Python 3.4 以來,shutil中的任何函式都未使用過它,現在它是RuntimeError的別名。
-
Class.get_methods方法已自 Python 3.14 起棄用。
sys:_enablelegacywindowsfsencoding()函式自 Python 3.13 起已棄用。請改用PYTHONLEGACYWINDOWSFSENCODING環境變數。
-
sysconfig.expand_makefile_vars()函式已自 Python 3.14 起棄用。請改用sysconfig.get_paths()的vars引數。
-
未寫入文件且未使用的
TarFile.tarfile屬性已自 Python 3.13 起棄用。
計劃在 Python 3.17 中移除¶
-
collections.abc.ByteString計劃在 Python 3.17 中移除。要測試
obj是否在執行時實現了緩衝區協議,請使用isinstance(obj, collections.abc.Buffer)。在型別註解中,請使用Buffer或顯式指定程式碼支援的型別的聯合型別(例如bytes | bytearray | memoryview)。ByteString最初旨在作為bytes和bytearray的超型別。然而,由於 ABC 從未有任何方法,知道一個物件是ByteString的例項實際上並不能告訴你任何關於該物件的有用資訊。其他常見的緩衝區型別,如memoryview,也從未被理解為ByteString的子型別(無論是執行時還是靜態型別檢查器)。
-
在 Python 3.14 之前,舊式聯合型別是透過私有類
typing._UnionGenericAlias實現的。該類對於實現已不再需要,但為了向後相容而保留,並計劃在 Python 3.17 中移除。使用者應使用文件化的內省輔助工具,如typing.get_origin()和typing.get_args(),而不是依賴於私有實現細節。typing.ByteString,自 Python 3.9 起已棄用,計劃在 Python 3.17 中移除。要測試
obj是否在執行時實現了緩衝區協議,請使用isinstance(obj, collections.abc.Buffer)。在型別註解中,請使用Buffer或顯式指定程式碼支援的型別的聯合型別(例如bytes | bytearray | memoryview)。ByteString最初旨在作為bytes和bytearray的超型別。然而,由於 ABC 從未有任何方法,知道一個物件是ByteString的例項實際上並不能告訴你任何關於該物件的有用資訊。其他常見的緩衝區型別,如memoryview,也從未被理解為ByteString的子型別(無論是執行時還是靜態型別檢查器)。
計劃在未來版本中移除¶
以下 API 將在未來移除,但目前尚未確定移除日期。
-
巢狀引數組和巢狀互斥組的做法已被棄用。
向
add_argument_group()傳遞未寫入文件的關鍵字引數 prefix_chars 的做法現已棄用。argparse.FileType型別轉換器已被棄用。
-
生成器:
throw(type, exc, tb)和athrow(type, exc, tb)簽名已被棄用:請改用單引數簽名的throw(exc)和athrow(exc)。目前 Python 接受緊跟著關鍵字的數字字面量,例如
0in x、1or x、0if 1else 2。這允許混淆和模糊的表示式,例如[0x1for x in y](可以解釋為[0x1 for x in y]或[0x1f or x in y])。如果數字字面量緊跟著關鍵字and、else、for、if、in、is和or之一,則會引發語法警告。在未來版本中,這將更改為語法錯誤。( gh-87999 )對
__index__()和__int__()方法返回非 int 型別的支援:這些方法將被要求返回int的嚴格子類的例項。對
__complex__()方法返回complex的嚴格子類的支援:這些方法將被要求返回complex的例項。將
int()委託給__trunc__()方法的做法。在
complex()建構函式中將複數作為 real 或 imag 引數傳遞的做法現已棄用;它應該僅作為單個位置引數傳遞。(由 Serhiy Storchaka 在 gh-109218 中貢獻。)
calendar:calendar.January和calendar.February常量已棄用,並由calendar.JANUARY和calendar.FEBRUARY替換。(由 Prince Roshan 在 gh-103636 貢獻)。codecs:請使用open()而不是codecs.open()。(gh-133038)-
utcnow():請使用datetime.datetime.now(tz=datetime.UTC)。utcfromtimestamp():請使用datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)。
gettext:複數值必須是整數。-
cache_from_source()的 debug_override 引數已被棄用:請改用 optimization 引數。
-
EntryPoints元組介面。返回值的隱式
None。
mailbox:使用 StringIO 輸入和文字模式已被棄用,請改用 BytesIO 和二進位制模式。os:在多執行緒程序中呼叫os.register_at_fork()。pydoc.ErrorDuringImport:exc_info 引數使用元組值的做法已被棄用,請改用異常例項。re:現在對正則表示式中的數字組引用和組名應用了更嚴格的規則。現在只接受 ASCII 數字序列作為數字引用。位元組串模式和替換字串中的組名現在只能包含 ASCII 字母、數字和下劃線。(由 Serhiy Storchaka 在 gh-91760 中貢獻。)sre_compile、sre_constants和sre_parse模組。shutil:rmtree()的 onerror 引數在 Python 3.12 中已棄用;請改用 onexc 引數。ssl選項和協議不帶協議引數的
ssl.SSLContext已被棄用。ssl.SSLContext:set_npn_protocols()和selected_npn_protocol()已被棄用:請改用 ALPN。ssl.OP_NO_SSL*選項ssl.OP_NO_TLS*選項ssl.PROTOCOL_SSLv3ssl.PROTOCOL_TLSssl.PROTOCOL_TLSv1ssl.PROTOCOL_TLSv1_1ssl.PROTOCOL_TLSv1_2ssl.TLSVersion.SSLv3ssl.TLSVersion.TLSv1ssl.TLSVersion.TLSv1_1
threading方法threading.Condition.notifyAll():請使用notify_all()。threading.Event.isSet():請使用is_set()。threading.Thread.isDaemon()、threading.Thread.setDaemon():請使用threading.Thread.daemon屬性。threading.Thread.getName()、threading.Thread.setName():請使用threading.Thread.name屬性。threading.currentThread():請使用threading.current_thread()。threading.activeCount():請使用threading.active_count()。
內部類
typing._UnionGenericAlias不再用於實現typing.Union。為了保持與使用此私有類的使用者的相容性,將提供一個相容性墊片,至少持續到 Python 3.17。(由 Jelle Zijlstra 在 gh-105499 中貢獻。)unittest.IsolatedAsyncioTestCase:從測試用例返回非None的值已被棄用。urllib.parse中已棄用的函式:請改用urlparse()splitattr()splithost()splitnport()splitpasswd()splitport()splitquery()splittag()splittype()splituser()splitvalue()to_bytes()
wsgiref:SimpleHandler.stdout.write()不應進行部分寫入。xml.etree.ElementTree:測試Element的真值的做法已被棄用。在未來的版本中,它將始終返回True。請優先使用顯式的len(elem)或elem is not None測試。sys._clear_type_cache()已被棄用:請改用sys._clear_internal_caches()。
已移除¶
asynchat 和 asyncore¶
configparser¶
configparser中自 3.2 以來棄用的一些名稱已根據 gh-89336 移除。configparser.ParsingError不再具有filename屬性或引數。請改用source屬性和引數。configparser不再具有SafeConfigParser類。請改用較短的ConfigParser名稱。configparser.ConfigParser不再具有readfp方法。請改用read_file()。
distutils¶
ensurepip¶
從
ensurepip中移除了捆綁的 setuptools wheel,並停止在venv建立的環境中安裝 setuptools。pip (>= 22.1)不需要環境安裝 setuptools。setuptools-based (和distutils-based) 包仍然可以透過pip install使用,因為 pip 將在用於構建包的構建環境中提供setuptools。easy_install、pkg_resources、setuptools和distutils不再由venv建立或透過ensurepip引導的環境中預設提供,因為它們是setuptools包的一部分。對於在執行時依賴這些的專案,應將setuptools專案宣告為依賴項並單獨安裝(通常使用 pip)。(由 Pradyun Gedam 在 gh-95299 貢獻)。
enum¶
ftplib¶
gzip¶
移除了
gzip的gzip.GzipFile的filename屬性,該屬性自 Python 2.6 起已棄用,請改用name屬性。在寫入模式下,如果filename屬性不存在'.gz'副檔名,它會新增該副檔名。(由 Victor Stinner 在 gh-94196 貢獻)。
hashlib¶
移除了
hashlib的hashlib.pbkdf2_hmac()的純 Python 實現,該實現已在 Python 3.10 中棄用。Python 3.10 及更高版本要求 OpenSSL 1.1.1 (PEP 644):此 OpenSSL 版本提供了pbkdf2_hmac()的 C 實現,速度更快。(由 Victor Stinner 在 gh-94199 貢獻)。
importlib¶
importlib中許多先前棄用的清理工作現已完成:對
module_repr()的引用和支援已移除。(由 Barry Warsaw 在 gh-97850 貢獻)。importlib.util.set_package、importlib.util.set_loader和importlib.util.module_for_loader都已移除。(由 Brett Cannon 和 Nikita Sobolev 在 gh-65961 和 gh-97850 貢獻)。對
find_loader()和find_module()API 的支援已移除。(由 Barry Warsaw 在 gh-98040 貢獻)。importlib.abc.Finder、pkgutil.ImpImporter和pkgutil.ImpLoader已移除。(由 Barry Warsaw 在 gh-98040 貢獻)。
imp¶
imp模組已移除。(由 Barry Warsaw 在 gh-98040 貢獻)。要遷移,請參考以下對應表:
imp
importlib
imp.NullImporter將
None插入sys.path_importer_cacheimp.cache_from_source()imp.find_module()imp.get_magic()imp.get_suffixes()importlib.machinery.SOURCE_SUFFIXES、importlib.machinery.EXTENSION_SUFFIXES和importlib.machinery.BYTECODE_SUFFIXESimp.get_tag()imp.load_module()imp.new_module(name)types.ModuleType(name)imp.reload()imp.source_from_cache()imp.load_source()請參閱下文
將
imp.load_source()替換為import importlib.util import importlib.machinery def load_source(modname, filename): loader = importlib.machinery.SourceFileLoader(modname, filename) spec = importlib.util.spec_from_file_location(modname, filename, loader=loader) module = importlib.util.module_from_spec(spec) # The module is always executed and not cached in sys.modules. # Uncomment the following line to cache the module. # sys.modules[module.__name__] = module loader.exec_module(module) return module
移除了沒有替代品的
imp函式和屬性:未文件化的函式:
imp.init_builtin()imp.load_compiled()imp.load_dynamic()imp.load_package()
imp.lock_held()、imp.acquire_lock()、imp.release_lock():鎖定方案已在 Python 3.3 中更改為按模組鎖定。imp.find_module()常量:SEARCH_ERROR、PY_SOURCE、PY_COMPILED、C_EXTENSION、PY_RESOURCE、PKG_DIRECTORY、C_BUILTIN、PY_FROZEN、PY_CODERESOURCE、IMP_HOOK。
io¶
locale¶
移除
locale的locale.format()函式,它在 Python 3.7 中已棄用:請改用locale.format_string()。(由 Victor Stinner 在 gh-94226 中貢獻。)
smtpd¶
sqlite3¶
以下未文件化的
sqlite3功能,在 Python 3.10 中已棄用,現已移除sqlite3.enable_shared_cache()sqlite3.OptimizedUnicode
如果必須使用共享快取,請在 URI 模式下使用
cache=shared查詢引數開啟資料庫。sqlite3.OptimizedUnicode文字工廠自 Python 3.3 起已成為str的別名。以前將文字工廠設定為OptimizedUnicode的程式碼現在可以顯式使用str,或依賴於預設值(也是str)。(由 Erlend E. Aasland 在 gh-92548 中貢獻。)
ssl¶
移除
ssl的ssl.RAND_pseudo_bytes()函式,它在 Python 3.6 中已棄用:請改用os.urandom()或ssl.RAND_bytes()。(由 Victor Stinner 在 gh-94199 中貢獻。)移除
ssl.match_hostname()函式。它在 Python 3.7 中已棄用。OpenSSL 自 Python 3.7 起執行主機名匹配,Python 不再使用ssl.match_hostname()函式。(由 Victor Stinner 在 gh-94199 中貢獻。)移除
ssl.wrap_socket()函式,它在 Python 3.7 中已棄用:請改為建立ssl.SSLContext物件並呼叫其ssl.SSLContext.wrap_socket方法。任何仍使用ssl.wrap_socket()的包都是損壞且不安全的。該函式既不傳送 SNI TLS 擴充套件也不驗證伺服器主機名。程式碼受 CWE 295(不當證書驗證)的影響。(由 Victor Stinner 在 gh-94199 中貢獻。)
unittest¶
移除許多長期棄用的
unittest功能一些
TestCase方法別名已棄用的別名
方法名稱
棄用版本
failUnless3.1
failIf3.1
failUnlessEqual3.1
failIfEqual3.1
failUnlessAlmostEqual3.1
failIfAlmostEqual3.1
failUnlessRaises3.1
assert_3.2
assertEquals3.2
assertNotEquals3.2
assertAlmostEquals3.2
assertNotAlmostEquals3.2
assertRegexpMatches3.2
assertRaisesRegexp3.2
assertNotRegexpMatches3.5
您可以使用 https://github.com/isidentical/teyit 自動更新您的單元測試。
未文件化且損壞的
TestCase方法assertDictContainsSubset(在 Python 3.2 中已棄用)。未文件化的
TestLoader.loadTestsFromModule引數 use_load_tests(自 Python 3.5 起已棄用並忽略)。TextTestResult類的別名:_TextTestResult(在 Python 3.2 中已棄用)。
(由 Serhiy Storchaka 在 gh-89325 中貢獻。)
webbrowser¶
從
webbrowser移除對過時瀏覽器的支援。移除的瀏覽器包括:Grail、Mosaic、Netscape、Galeon、Skipstone、Iceape、Firebird 以及 Firefox 35 及以下版本(gh-102871)。
xml.etree.ElementTree¶
移除純 Python 實現的
ElementTree.Element.copy()方法,它在 Python 3.10 中已棄用,請改用copy.copy()函式。xml.etree.ElementTree的 C 實現沒有copy()方法,只有__copy__()方法。(由 Victor Stinner 在 gh-94383 中貢獻。)
zipimport¶
其他¶
移除文件
Makefile和Doc/tools/rstlint.py中的suspicious規則,兩者都支援 sphinx-lint。(由 Julien Palard 在 gh-98179 中貢獻。)從
ftplib、imaplib、poplib和smtplib模組中移除 keyfile 和 certfile 引數,並從http.client模組中移除 key_file、cert_file 和 check_hostname 引數,所有這些都在 Python 3.6 中已棄用。請改用 context 引數(在imaplib中為 ssl_context)。(由 Victor Stinner 在 gh-94172 中貢獻。)移除幾個標準庫模組和測試中
Jython相容性補丁。(由 Nikita Sobolev 在 gh-99482 中貢獻。)從
ctypes模組中移除_use_broken_old_ctypes_structure_semantics_標誌。(由 Nikita Sobolev 在 gh-99285 中貢獻。)
移植到 Python 3.12¶
本節列出了前面描述過的變更以及其他可能需要修改程式碼的 bug 修復。
Python API 的變化¶
現在對正則表示式中的數字組引用和組名稱應用更嚴格的規則。現在只接受 ASCII 數字序列作為數字引用。位元組模式和替換字串中的組名稱現在只能包含 ASCII 字母和數字以及下劃線。(由 Serhiy Storchaka 在 gh-91760 中貢獻。)
移除自 Python 3.10 起已棄用的
randrange()功能。以前,randrange(10.0)無損地轉換為randrange(10)。現在,它會引發TypeError。此外,對非整數值(如randrange(10.5)或randrange('10'))引發的異常已從ValueError更改為TypeError。這還可以防止randrange(1e25)會靜默地從比randrange(10**25)更大的範圍中選擇的錯誤。(最初由 Serhiy Storchaka 建議 gh-86388。)argparse.ArgumentParser更改了從檔案讀取引數(例如fromfile_prefix_chars選項)的編碼和錯誤處理程式,從預設文字編碼(例如locale.getpreferredencoding(False))更改為 檔案系統編碼和錯誤處理程式。Windows 上的引數檔案應以 UTF-8 而不是 ANSI 內碼表進行編碼。移除在 Python 3.4.7 和 3.5.4 中已棄用的基於
asyncore的smtpd模組。推薦的替代方案是基於asyncio的 aiosmtpd PyPI 模組。shlex.split():為 s 引數傳遞None現在會引發異常,而不是讀取sys.stdin。此功能在 Python 3.9 中已棄用。(由 Victor Stinner 在 gh-94352 中貢獻。)os模組不再接受類位元組路徑,例如bytearray和memoryview型別:只接受確切的bytes型別作為位元組字串。(由 Victor Stinner 在 gh-98393 中貢獻。)syslog.openlog()和syslog.closelog()如果在子直譯器中使用,現在會失敗。syslog.syslog()仍可在子直譯器中使用,但現在只有在主直譯器中已呼叫syslog.openlog()的情況下才行。這些新限制不適用於主直譯器,因此只有非常小一部分使用者可能會受到影響。此更改有助於直譯器隔離。此外,syslog是一個圍繞程序全域性資源的包裝器,最好由主直譯器管理。(由 Donghee Na 在 gh-99127 中貢獻。)移除
cached_property()的未文件化鎖定行為,因為它鎖定了類的所有例項,導致高鎖爭用。這意味著如果兩個執行緒競爭,快取屬性 getter 函式現在可以為單個例項執行多次。對於大多數簡單的快取屬性(例如那些冪等且僅根據例項的其他屬性計算值的屬性),這會很好。如果需要同步,請在快取屬性 getter 函式內或多執行緒訪問點周圍實現鎖定。sys._current_exceptions()現在返回從執行緒 ID 到異常例項的對映,而不是到(typ, exc, tb)元組的對映。(由 Irit Katriel 在 gh-103176 中貢獻。)使用
tarfile或shutil.unpack_archive()提取 tar 檔案時,傳遞 filter 引數以限制可能令人意外或危險的功能。有關詳細資訊,請參閱 提取過濾器。由於 PEP 701 引入的更改,
tokenize.tokenize()和tokenize.generate_tokens()函式的輸出現在已更改。這意味著 f-字串不再發出STRING令牌,而是生成 PEP 701 中描述的令牌:FSTRING_START、FSTRING_MIDDLE和FSTRING_END現在除了表示式元件中分詞的適當令牌外,還為 f-字串“字串”部分發出。例如,對於 f-字串f"start {1+1} end",舊版分詞器發出1,0-1,18: STRING 'f"start {1+1} end"'
而新版本發出
1,0-1,2: FSTRING_START 'f"' 1,2-1,8: FSTRING_MIDDLE 'start ' 1,8-1,9: OP '{' 1,9-1,10: NUMBER '1' 1,10-1,11: OP '+' 1,11-1,12: NUMBER '1' 1,12-1,13: OP '}' 1,13-1,17: FSTRING_MIDDLE ' end' 1,17-1,18: FSTRING_END '"'
此外,由於支援 PEP 701 所需的更改,可能還會出現一些細微的行為更改。其中一些更改包括
分詞一些無效 Python 字元(如
!)時發出的令牌的type屬性已從ERRORTOKEN更改為OP。不完整的單行字串現在也像不完整的多行字串一樣引發
tokenize.TokenError。一些不完整或無效的 Python 程式碼現在在分詞時會引發
tokenize.TokenError,而不是返回任意ERRORTOKEN令牌。同一檔案中混合使用製表符和空格作為縮排不再受支援,並且會引發
TabError。
threading模組現在期望_thread模組具有_is_main_interpreter屬性。它是一個不帶引數的函式,如果當前直譯器是主直譯器,則返回True。任何提供自定義
_thread模組的庫或應用程式都應提供_is_main_interpreter()。(請參閱 gh-112826。)
構建變更¶
Python 不再使用
setup.py來構建共享 C 擴充套件模組。configure指令碼中檢測標頭檔案和庫等構建引數。擴充套件由Makefile構建。大多數擴充套件使用pkg-config並回退到手動檢測。(由 Christian Heimes 在 gh-93939 中貢獻。)現在需要使用帶有兩個引數的
va_start()(例如va_start(args, format),)來構建 Python。va_start()不再使用單個引數呼叫。(由 Kumar Aditya 在 gh-93207 中貢獻。)如果 Clang 編譯器接受該標誌,CPython 現在使用 ThinLTO 選項作為預設連結時間最佳化策略。(由 Donghee Na 在 gh-89536 中貢獻。)
在
Makefile中新增COMPILEALL_OPTS變數,以在make install中覆蓋compileall選項(預設值:-j0)。還將 3 個compileall命令合併為一個命令,以同時構建所有最佳化級別(0、1、2)的 .pyc 檔案。(由 Victor Stinner 在 gh-99289 中貢獻。)為 64 位 LoongArch 新增平臺三元組
loongarch64-linux-gnusf
loongarch64-linux-gnuf32
loongarch64-linux-gnu
(由 Zhang Na 在 gh-90656 中貢獻。)
PYTHON_FOR_REGEN現在需要 Python 3.10 或更高版本。現在需要 Autoconf 2.71 和 aclocal 1.16.4 才能重新生成
configure。(由 Christian Heimes 在 gh-89886 中貢獻。)python.org 的 Windows 版本和 macOS 安裝程式現在使用 OpenSSL 3.0。
C API 變更¶
新功能¶
PEP 697:引入 不穩定 C API 層,旨在用於偵錯程式和 JIT 編譯器等低階工具。此 API 可能在 CPython 的每個次要版本中更改,恕不發出棄用警告。其內容由名稱中的
PyUnstable_字首標記。程式碼物件建構函式
PyUnstable_Code_New()(從PyCode_New重新命名)PyUnstable_Code_NewWithPosOnlyArgs()(從PyCode_NewWithPosOnlyArgs重新命名)
程式碼物件的額外儲存(PEP 523)
PyUnstable_Eval_RequestCodeExtraIndex()(從_PyEval_RequestCodeExtraIndex重新命名)PyUnstable_Code_GetExtra()(從_PyCode_GetExtra重新命名)PyUnstable_Code_SetExtra()(從_PyCode_SetExtra重新命名)
原始名稱將繼續可用,直到相應的 API 更改為止。
(由 Petr Viktorin 在 gh-101101 中貢獻。)
PEP 697:新增用於擴充套件其例項記憶體佈局不透明的型別 API
PyType_Spec.basicsize可以為零或負數,以指定繼承或擴充套件基類大小。新增
PyObject_GetTypeData()和PyType_GetTypeDataSize()以允許訪問子類特定的例項資料。新增
Py_TPFLAGS_ITEMS_AT_END和PyObject_GetItemData()以允許安全地擴充套件某些可變大小的型別,包括PyType_Type。新增
Py_RELATIVE_OFFSET以允許根據子類特定的結構定義members。
(由 Petr Viktorin 在 gh-103509 中貢獻。)
新增新的 有限 C API 函式
PyType_FromMetaclass(),它使用額外的元類引數泛化了現有的PyType_FromModuleAndSpec()。(由 Wenzel Jakob 在 gh-93012 中貢獻。)已將用於建立可以使用 vectorcall 協議 呼叫的物件的 API 新增到 有限 API
當類的
__call__()方法被重新賦值時,Py_TPFLAGS_HAVE_VECTORCALL標誌現在從類中移除。這使得 vectorcall 可以安全地與可變型別(即沒有不可變標誌的堆型別,Py_TPFLAGS_IMMUTABLETYPE)一起使用。不重寫tp_call的可變型別現在繼承Py_TPFLAGS_HAVE_VECTORCALL標誌。(由 Petr Viktorin 在 gh-93274 中貢獻。)已新增
Py_TPFLAGS_MANAGED_DICT和Py_TPFLAGS_MANAGED_WEAKREF標誌。這允許擴充套件類以更少的簿記、更少的記憶體和更快的訪問來支援物件__dict__和弱引用。已將用於使用 vectorcall 協議 執行呼叫的 API 新增到 有限 API
這意味著 vector call 協議的傳入和傳出端現在都可在 有限 API 中使用。(由 Wenzel Jakob 在 gh-98586 中貢獻。)
新增兩個新的公共函式,
PyEval_SetProfileAllThreads()和PyEval_SetTraceAllThreads(),它們允許除了呼叫執行緒之外,還在所有正在執行的執行緒中設定跟蹤和分析函式。(由 Pablo Galindo 在 gh-93503 中貢獻。)向 C API 新增新函式
PyFunction_SetVectorcall(),它設定給定PyFunctionObject的 vectorcall 欄位。(由 Andrew Frost 在 gh-92257 中貢獻。)C API 現在允許透過
PyDict_AddWatcher()、PyDict_Watch()和相關 API 註冊回撥,以便在字典被修改時被呼叫。這旨在供最佳化直譯器、JIT 編譯器或偵錯程式使用。(由 Carl Meyer 在 gh-91052 中貢獻。)新增
PyType_AddWatcher()和PyType_Watch()API,以註冊回撥以接收型別更改通知。(由 Carl Meyer 在 gh-91051 中貢獻。)新增
PyCode_AddWatcher()和PyCode_ClearWatcher()API,以註冊回撥以接收程式碼物件的建立和銷燬通知。(由 Itamar Oren 在 gh-91054 中貢獻。)新增
PyFrame_GetVar()和PyFrame_GetVarString()函式,以透過名稱獲取幀變數。(由 Victor Stinner 在 gh-91248 中貢獻。)新增
PyErr_GetRaisedException()和PyErr_SetRaisedException()用於儲存和恢復當前異常。這些函式返回並接受單個異常物件,而不是現在已棄用的PyErr_Fetch()和PyErr_Restore()的三引數。這更不容易出錯,並且效率更高。(由 Mark Shannon 在 gh-101578 中貢獻。)新增
_PyErr_ChainExceptions1,它接受一個異常例項,以替換現在已棄用的舊版 API_PyErr_ChainExceptions。(由 Mark Shannon 在 gh-101578 中貢獻。)新增
PyException_GetArgs()和PyException_SetArgs()作為方便函式,用於檢索和修改傳遞給異常建構函式的args。(由 Mark Shannon 在 gh-101578 中貢獻。)新增
PyErr_DisplayException(),它接受一個異常例項,以替換舊版 APIPyErr_Display()。(由 Irit Katriel 在 gh-102755 中貢獻)。
PEP 683:引入 不朽物件,允許物件繞過引用計數,以及 C-API 的相關更改
_Py_IMMORTAL_REFCNT:定義物件為不朽的引用計數。作為不朽的。
_Py_IsImmortal檢查物件是否具有不朽引用計數。PyObject_HEAD_INIT當與Py_BUILD_CORE一起使用時,這現在會將引用計數初始化為_Py_IMMORTAL_REFCNT。
SSTATE_INTERNED_IMMORTAL已intern unicode 物件的識別符號是不朽的。
SSTATE_INTERNED_IMMORTAL_STATIC已intern unicode 物件的識別符號是不朽且靜態的
sys.getunicodeinternedsize這返回已intern的 unicode 物件的總數已intern。現在需要它才能使
refleak.py正確跟蹤引用計數和分配的塊
(由 Eddie Elizondo 在 gh-84436 中貢獻。)
PEP 684:新增新的
Py_NewInterpreterFromConfig()函式和PyInterpreterConfig,它們可用於建立具有自己 GIL 的子直譯器。(有關詳細資訊,請參閱 PEP 684:每個直譯器一個 GIL。)(由 Eric Snow 在 gh-104110 中貢獻。)在有限 C API 版本 3.12 中,
Py_INCREF()和Py_DECREF()函式現在作為不透明函式呼叫實現,以隱藏實現細節。(由 Victor Stinner 在 gh-105387 中貢獻。)
移植到 Python 3.12¶
基於
Py_UNICODE*表示的舊版 Unicode API 已被移除。請遷移到基於 UTF-8 或wchar_t*的 API。引數解析函式(如
PyArg_ParseTuple())不再支援基於Py_UNICODE*的格式(例如u、Z)。請遷移到其他 Unicode 格式,如s、z、es和U。所有靜態內建型別的
tp_weaklist始終為NULL。這是PyTypeObject上的一個內部欄位,但我們指出此更改以防有人直接訪問該欄位。為避免損壞,請考慮改用現有的公共 C-API,或者,如果需要,使用(僅限內部)_PyObject_GET_WEAKREFS_LISTPTR()宏。此僅限內部的
PyTypeObject.tp_subclasses現在可能不是有效的物件指標。其型別已更改為 void* 以反映這一點。我們提到這一點以防有人直接訪問內部欄位。要獲取子類列表,請呼叫 Python 方法
__subclasses__()(例如,使用PyObject_CallMethod())。在
PyUnicode_FromFormat()和PyUnicode_FromFormatV()中添加了對更多格式選項(左對齊、八進位制、大寫十六進位制、intmax_t、ptrdiff_t、wchar_tC 字串、可變寬度和精度)的支援。(由 Serhiy Storchaka 在 gh-98836 中貢獻。)PyUnicode_FromFormat()和PyUnicode_FromFormatV()中的無法識別的格式字元現在會設定SystemError。在以前的版本中,它會導致格式字串的其餘部分按原樣複製到結果字串中,並丟棄任何額外的引數。(由 Serhiy Storchaka 在 gh-95781 中貢獻。)修復
PyUnicode_FromFormat()和PyUnicode_FromFormatV()中錯誤的符號位置。(由 Philip Georgi 在 gh-95504 中貢獻。)希望新增
__dict__或弱引用槽的擴充套件類應使用Py_TPFLAGS_MANAGED_DICT和Py_TPFLAGS_MANAGED_WEAKREF,而不是tp_dictoffset和tp_weaklistoffset。仍支援使用tp_dictoffset和tp_weaklistoffset,但它不完全支援多重繼承(gh-95589),並且效能可能更差。宣告Py_TPFLAGS_MANAGED_DICT的類必須呼叫_PyObject_VisitManagedDict()和_PyObject_ClearManagedDict()來遍歷和清除其例項的字典。要清除弱引用,請像以前一樣呼叫PyObject_ClearWeakRefs()。PyUnicode_FSDecoder()函式不再接受類位元組路徑,例如bytearray和memoryview型別:只接受確切的bytes型別作為位元組字串。(由 Victor Stinner 在 gh-98393 中貢獻。)Py_CLEAR、Py_SETREF和Py_XSETREF宏現在只評估其引數一次。如果引數具有副作用,這些副作用將不再重複。(由 Victor Stinner 在 gh-98724 中貢獻。)直譯器的錯誤指示器現在始終規範化。這意味著
PyErr_SetObject()、PyErr_SetString()和其他設定錯誤指示器的函式現在在儲存異常之前對其進行規範化。(由 Mark Shannon 在 gh-101578 中貢獻。)_Py_RefTotal不再是權威的,僅為了 ABI 相容性而保留。請注意,它是一個內部全域性變數,僅在除錯版本中可用。如果您碰巧正在使用它,那麼您需要開始使用_Py_GetGlobalRefTotal()。以下函式現在為新建立的型別選擇適當的元類
建立其元類重寫
tp_new的類已棄用,並且在 Python 3.14+ 中將被禁止。請注意,這些函式忽略元類的tp_new,可能導致不完全初始化。請注意,
PyType_FromMetaclass()(在 Python 3.12 中新增)已經禁止建立其元類重寫tp_new(Python 中的__new__())的類。由於
tp_new重寫了PyType_From*函式幾乎所有功能,因此兩者彼此不相容。現有行為——在型別建立的幾個步驟中忽略元類——通常是不安全的,因為(元)類假定已呼叫tp_new。沒有簡單的通用解決方法。以下之一可能適合您如果您控制元類,請避免在其中使用
tp_new如果可以跳過初始化,則可以在
tp_init中完成。如果元類不需要從 Python 例項化,請使用
Py_TPFLAGS_DISALLOW_INSTANTIATION標誌將其tp_new設定為NULL。這使得PyType_From*函式可以接受它。
避免使用
PyType_From*函式:如果您不需要 C 特有的功能(槽或設定例項大小),請透過 呼叫 元類來建立型別。如果您 知道 可以安全跳過
tp_new,請使用 Python 中的warnings.catch_warnings()過濾掉棄用警告。
PyOS_InputHook和PyOS_ReadlineFunctionPointer不再在 子直譯器 中呼叫。這是因為客戶端通常依賴於程序範圍的全域性狀態(因為這些回撥無法恢復擴充套件模組狀態)。這還避免了擴充套件程式可能發現自己執行在不支援(或尚未載入)的子直譯器中的情況。有關詳細資訊,請參閱 gh-104668。
PyLongObject的內部結構已更改以提高效能。儘管PyLongObject的內部結構是私有的,但它們被一些擴充套件模組使用。內部欄位不應再直接訪問,而應改用以PyLong_...開頭的 API 函式。提供了兩個新的 不穩定 API 函式,用於高效訪問適合單個機器字的PyLongObject的值現在要求透過
PyMem_SetAllocator()設定的自定義分配器是執行緒安全的,無論記憶體域如何。沒有自己狀態的分配器,包括“鉤子”,不受影響。如果您的自定義分配器尚未執行緒安全並且您需要指導,請建立新的 GitHub issue 並抄送@ericsnowcurrently。
已棄用¶
根據 PEP 699,
PyDictObject中的ma_version_tag欄位已針對擴充套件模組棄用。在編譯時訪問此欄位將生成編譯器警告。此欄位將在 Python 3.14 中移除。(由 Ramvikrams 和 Kumar Aditya 在 gh-101193 中貢獻。PEP 作者 Ken Jin。)棄用全域性配置變數
Py_HashRandomizationFlag: 使用PyConfig.use_hash_seed和PyConfig.hash_seedPy_LegacyWindowsFSEncodingFlag: 使用PyPreConfig.legacy_windows_fs_encodingPy_FileSystemDefaultEncoding: 使用PyConfig.filesystem_encodingPy_HasFileSystemDefaultEncoding: 使用PyConfig.filesystem_encodingPy_FileSystemDefaultEncodeErrors: 使用PyConfig.filesystem_errorsPy_UTF8Mode: 使用PyPreConfig.utf8_mode(參閱Py_PreInitialize())
應該使用
Py_InitializeFromConfig()API 和PyConfig代替。(由 Victor Stinner 在 gh-77782 中貢獻。)structmember.h標頭檔案已棄用,儘管它仍然可用,並且沒有計劃將其移除。現在只需包含
Python.h,其內容即可使用,如果缺少,則會新增Py字首型別宏,如
Py_T_INT、Py_T_DOUBLE等(以前是T_INT、T_DOUBLE等)標誌
Py_READONLY(以前是READONLY)和Py_AUDIT_READ(以前全是大寫)
有幾項未從
Python.h中公開T_OBJECT(使用Py_T_OBJECT_EX)T_NONE(以前未文件化,而且相當古怪)宏
WRITE_RESTRICTED,它什麼也不做。宏
RESTRICTED和READ_RESTRICTED,它們與Py_AUDIT_READ等效。在某些配置中,
<stddef.h>未包含在Python.h中。使用offsetof()時應手動包含它。
已棄用的標頭檔案繼續以原始名稱提供其原始內容。您的舊程式碼可以保持不變,除非額外的包含和未名稱空間的宏對您造成很大困擾。
(由 Petr Viktorin 在 gh-47146 中貢獻,基於 Alexander Belopolsky 和 Matthias Braun 的早期工作。)
PyErr_Fetch()和PyErr_Restore()已被棄用。請改用PyErr_GetRaisedException()和PyErr_SetRaisedException()。(由 Mark Shannon 在 gh-101578 中貢獻。)PyErr_Display()已被棄用。請改用PyErr_DisplayException()。(由 Irit Katriel 在 gh-102755 中貢獻)。_PyErr_ChainExceptions已被棄用。請改用_PyErr_ChainExceptions1。(由 Irit Katriel 在 gh-102192 中貢獻。)使用
PyType_FromSpec()、PyType_FromSpecWithBases()或PyType_FromModuleAndSpec()建立其元類覆蓋tp_new的類已被棄用。請改用元類。
預計在 Python 3.14 中移除¶
擴充套件模組的
PyDictObject中的ma_version_tag欄位 (PEP 699; gh-101193)。
預計在 Python 3.15 中移除¶
PyWeakref_GetObject()和PyWeakref_GET_OBJECT():請改用PyWeakref_GetRef()。可以使用 pythoncapi-compat 專案 在 Python 3.12 及更早版本上獲取PyWeakref_GetRef()。Py_UNICODE型別和Py_UNICODE_WIDE宏:請改用wchar_t。PyUnicode_AsDecodedObject():請改用PyCodec_Decode()。PyUnicode_AsDecodedUnicode():請改用PyCodec_Decode();請注意,某些編解碼器(例如“base64”)可能返回str以外的型別,例如bytes。PyUnicode_AsEncodedObject():請改用PyCodec_Encode()。PyUnicode_AsEncodedUnicode():請改用PyCodec_Encode();請注意,某些編解碼器(例如“base64”)可能返回bytes以外的型別,例如str。Python 初始化函式,在 Python 3.13 中被棄用
Py_GetPath():請改用PyConfig_Get("module_search_paths")(sys.path)。Py_GetPrefix():請改用PyConfig_Get("base_prefix")(sys.base_prefix)。如果需要處理 虛擬環境,請使用PyConfig_Get("prefix")(sys.prefix)。Py_GetExecPrefix():請改用PyConfig_Get("base_exec_prefix")(sys.base_exec_prefix)。如果需要處理 虛擬環境,請使用PyConfig_Get("exec_prefix")(sys.exec_prefix)。Py_GetProgramFullPath():請改用PyConfig_Get("executable")(sys.executable)。Py_GetProgramName():請改用PyConfig_Get("executable")(sys.executable)。Py_GetPythonHome():請改用PyConfig_Get("home")或PYTHONHOME環境變數。
可以使用 pythoncapi-compat 專案 在 Python 3.13 及更早版本中獲得
PyConfig_Get()。用於配置 Python 初始化的函式,在 Python 3.11 中被棄用
PySys_SetArgvEx():請改用設定PyConfig.argv。PySys_SetArgv():請改用設定PyConfig.argv。Py_SetProgramName():請改用設定PyConfig.program_name。Py_SetPythonHome():請改用設定PyConfig.home。PySys_ResetWarnOptions():請改用清空sys.warnoptions和warnings.filters。
應使用
Py_InitializeFromConfig()API 與PyConfig配合使用。全域性配置變數
Py_DebugFlag:請改用PyConfig.parser_debug或PyConfig_Get("parser_debug")。Py_VerboseFlag:請改用PyConfig.verbose或PyConfig_Get("verbose")。Py_InteractiveFlag:請改用PyConfig.interactive或PyConfig_Get("interactive")。Py_InspectFlag:請改用PyConfig.inspect或PyConfig_Get("inspect")。Py_OptimizeFlag:請改用PyConfig.optimization_level或PyConfig_Get("optimization_level")。Py_NoSiteFlag:請改用PyConfig.site_import或PyConfig_Get("site_import")。Py_BytesWarningFlag:請改用PyConfig.bytes_warning或PyConfig_Get("bytes_warning")。Py_FrozenFlag:請改用PyConfig.pathconfig_warnings或PyConfig_Get("pathconfig_warnings")。Py_IgnoreEnvironmentFlag:請改用PyConfig.use_environment或PyConfig_Get("use_environment")。Py_DontWriteBytecodeFlag:請改用PyConfig.write_bytecode或PyConfig_Get("write_bytecode")。Py_NoUserSiteDirectory:請改用PyConfig.user_site_directory或PyConfig_Get("user_site_directory")。Py_UnbufferedStdioFlag:請改用PyConfig.buffered_stdio或PyConfig_Get("buffered_stdio")。Py_HashRandomizationFlag:請改用PyConfig.use_hash_seed和PyConfig.hash_seed或PyConfig_Get("hash_seed")。Py_IsolatedFlag:請改用PyConfig.isolated或PyConfig_Get("isolated")。Py_LegacyWindowsFSEncodingFlag:請改用PyPreConfig.legacy_windows_fs_encoding或PyConfig_Get("legacy_windows_fs_encoding")。Py_LegacyWindowsStdioFlag:請改用PyConfig.legacy_windows_stdio或PyConfig_Get("legacy_windows_stdio")。Py_FileSystemDefaultEncoding、Py_HasFileSystemDefaultEncoding:請改用PyConfig.filesystem_encoding或PyConfig_Get("filesystem_encoding")。Py_FileSystemDefaultEncodeErrors:請改用PyConfig.filesystem_errors或PyConfig_Get("filesystem_errors")。Py_UTF8Mode:請改用PyPreConfig.utf8_mode或PyConfig_Get("utf8_mode")。(請參閱Py_PreInitialize())
應使用
Py_InitializeFromConfig()API 與PyConfig一起設定這些選項。或者,可以使用PyConfig_Get()在執行時獲取這些選項。
預計在 Python 3.16 中移除¶
捆綁的
libmpdec副本。
預計在未來版本中移除¶
以下 API 已被棄用並將被移除,但目前尚未確定移除日期。
Py_TPFLAGS_HAVE_FINALIZE:自 Python 3.8 起已不再需要。PySlice_GetIndicesEx():請改用PySlice_Unpack()和PySlice_AdjustIndices()。PyUnicode_READY():自 Python 3.12 起已不再需要PyErr_Display():請改用PyErr_DisplayException()。_PyErr_ChainExceptions():請改用_PyErr_ChainExceptions1()。PyBytesObject.ob_shash成員:請改用呼叫PyObject_Hash()。執行緒本地儲存 (TLS) API
已移除¶
移除
token.h標頭檔案。從未有過公共的詞法分析器 C API。token.h標頭檔案僅用於 Python 內部使用。(由 Victor Stinner 在 gh-92651 中貢獻。)舊版 Unicode API 已移除。詳情請參閱 PEP 623。
PyUnicode_WCHAR_KINDPyUnicode_AS_UNICODE()PyUnicode_AsUnicode()PyUnicode_AsUnicodeAndSize()PyUnicode_AS_DATA()PyUnicode_FromUnicode()PyUnicode_GET_SIZE()PyUnicode_GetSize()PyUnicode_GET_DATA_SIZE()
移除
PyUnicode_InternImmortal()函式宏。(由 Victor Stinner 在 gh-85858 中貢獻。)