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-字串 刪除了許多限制,“你的意思是……”的建議不斷改進。新的型別引數語法和type
語句提高了使用泛型型別和類型別名以及靜態型別檢查器的人體工程學。
本文不嘗試提供所有新功能的完整規範,而是提供方便的概述。有關完整詳細資訊,您應該參考文件,例如庫參考和語言參考。如果您想了解更改的完整實現和設計原理,請參閱特定新功能的 PEP;但請注意,一旦功能完全實現,PEP 通常不會保持最新。
新的語法功能
新的語法功能
直譯器改進
PEP 669,低影響監控
Python 資料模型改進
標準庫的重大改進
pathlib.Path
類現在支援子類化os
模組在 Windows 支援方面進行了一些改進針對
執行時可檢查的協議
的isinstance()
檢查速度提高了 2 到 20 倍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-字串的句法形式化¶
PEP 701 取消了對 f-字串 使用的一些限制。f-字串內部的表示式元件現在可以是任何有效的 Python 表示式,包括重用與包含 f-字串相同的引號的字串、多行表示式、註釋、反斜槓和 Unicode 轉義序列。讓我們詳細介紹這些
引號重用:在 Python 3.11 中,重用與封閉 f-字串相同的引號會引發
SyntaxError
,迫使使用者要麼使用其他可用引號(例如,如果 f-字串使用單引號,則使用雙引號或三引號)。在 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-字串的巢狀方式沒有明確的限制,但事實上,字串引號不能在 f-字串的表示式元件內部重用,這使得任意巢狀 f-字串變得不可能。事實上,這是可以編寫的最巢狀的 f-字串
>>> f"""{f'''{f'{f"{1+1}"}'}'''}""" '2'
由於現在 f-字串可以在表示式元件內部包含任何有效的 Python 表示式,因此現在可以任意巢狀 f-字串
>>> f"{f"{f"{f"{f"{f"{1+1}"}"}"}"}"}" '2'
多行表示式和註釋:在 Python 3.11 中,f-字串表示式必須在單行中定義,即使 f-字串中的表示式通常可以跨越多行(例如,在多行上定義的文字列表),這使得它們更難閱讀。在 Python 3.12 中,你現在可以定義跨越多行的 f-字串,並新增內聯註釋
>>> 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-字串表示式不能包含任何
\
字元。這也影響了 Unicode 轉義序列(例如\N{snowman}
),因為這些序列包含之前不能作為 f-字串表示式元件一部分的\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-字串),現在 f-字串的錯誤訊息更加精確,幷包含錯誤的精確位置。例如,在 Python 3.11 中,以下 f-字串引發 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-字串是透過 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 提供,但預計 Python API 將在 3.13 中推出。
使用新的 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
ABC 提供了一種表示緩衝區物件的標準方法,例如在型別註釋中。新的 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 中貢獻。)八進位制轉義符的值大於
0o377
(例如:"\477"
),在 Python 3.11 中已被棄用,現在會產生一個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 位元組碼評估迴圈的 eval 斷路器機制上執行,而不是在物件分配時執行。當呼叫
PyErr_CheckSignals()
時,GC 也可以執行,因此需要長時間執行而不執行任何 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 profiler 的支援。(由 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()
函式,以允許選擇一個事件迴圈來進行 eager 任務執行,使某些用例的速度提高 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.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 中的速度快至少 2 倍。(由 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,用於匹配路徑的大小寫敏感性,從而更精確地控制匹配過程。
pdb¶
新增方便的變數以臨時儲存除錯會話的值,並提供對當前幀或返回值等值的快速訪問。(由 Tian Gao 在 gh-103693 中貢獻。)
random¶
新增
random.binomialvariate()
。(由 Raymond Hettinger 在 gh-81620 中貢獻。)向
random.expovariate()
新增預設值lambd=1.0
。(由 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 環境變數,以便在 Windows 上即使給定的 cmd 包含目錄元件時,也能在 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
新增sqlite3.Connection.autocommit
屬性,並向sqlite3.connect()
新增 autocommit 引數,以控制符合 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()
檢查現在使用inspect.getattr_static()
而不是hasattr()
來查詢屬性是否存在。這意味著在針對執行時可檢查協議進行isinstance()
檢查期間,描述符和__getattr__()
方法將不再被意外評估。 但是,這也可能意味著某些曾經被認為是執行時可檢查協議的例項的物件可能不再被視為 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()
檢查。針對
執行時可檢查協議
的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 中貢獻。)由於需要覆蓋 PEP 701 的更改在
tokenize
模組中,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
:自 Python 3.8 以來,以下ast
功能已在文件中棄用,現在在訪問或使用它們時會發出DeprecationWarning
,並將在 Python 3.14 中移除ast.Num
ast.Str
ast.Bytes
ast.NameConstant
ast.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
。建議使用Sequence
或collections.abc.Buffer
。對於型別提示,建議使用聯合型別,如bytes | bytearray
,或collections.abc.Buffer
。(由 Shantanu Jain 在 gh-91896 中貢獻。)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.ResourceReader
importlib.abc.Traversable
importlib.abc.TraversableResources
請改用
importlib.resources.abc
類(由 Jason R. Coombs 和 Hugo van Kemenade 在 gh-93963 中貢獻。)
itertools
: 棄用對 copy、deepcopy 和 pickle 操作的支援,這些操作未文件化、效率低下、歷史上存在錯誤且不一致。為了顯著減少程式碼量和維護負擔,將在 3.14 版本中移除此功能。(由 Raymond Hettinger 在 gh-101588 中貢獻。)multiprocessing
: 在 Python 3.14 中,預設的multiprocessing
啟動方法將在 Linux、BSD 和其他非 macOS POSIX 平臺上更改為更安全的方法。在這些平臺上,當前預設使用'fork'
(gh-84559)。新增關於此更改的執行時警告被認為過於干擾,因為大多數程式碼預計不會關心此問題。 當您的程式碼需要'fork'
時,請使用get_context()
或set_start_method()
API 來顯式指定。請參閱 上下文和啟動方法。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
:在 Windows 上,
os.stat()
和os.lstat()
返回的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 之前,提取 tar 歸檔檔案而不指定 filter 將被棄用,屆時'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()
的 3 引數簽名(型別、值、回溯)已被棄用,並且可能會在未來版本的 Python 中刪除。請改用這些函式的單引數版本。(由 Ofey Chan 在 gh-89874 中貢獻。)當模組上的
__package__
與__spec__.parent
不同時,現在會引發DeprecationWarning
(以前是ImportWarning
)。(由 Brett Cannon 在 gh-65961 中貢獻。)在模組上設定
__package__
或__cached__
已被棄用,並且在 Python 3.14 中將不再被匯入系統設定或考慮。(由 Brett Cannon 在 gh-65961 中貢獻。)布林值的按位反轉運算子 (
~
) 已被棄用。它將在 Python 3.16 中引發錯誤。請改用not
對布林值進行邏輯否定。在您確實需要底層int
的按位反轉的極少數情況下,請顯式轉換為 int:~int(x)
。(由 Tim Hoffmann 在 gh-103487 中貢獻。)透過 PEP 626,在 Python 3.10 中已棄用訪問程式碼物件上的
co_lnotab
,但在 3.12 中才得到了適當的DeprecationWarning
。可能會在 3.15 中刪除。(由 Nikita Sobolev 在 gh-101866 中貢獻。)
Python 3.13 中待移除的內容¶
模組(請參閱 PEP 594)
aifc
audioop
cgi
cgitb
chunk
crypt
imghdr
mailcap
msilib
nis
nntplib
ossaudiodev
pipes
sndhdr
spwd
sunau
telnetlib
uu
xdrlib
其他模組
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.Num
ast.Str
ast.Bytes
ast.NameConstant
ast.Ellipsis
請改用
ast.Constant
。(由 Serhiy Storchaka 在 gh-90953 中貢獻。)-
子程序監視器類
MultiLoopChildWatcher
、FastChildWatcher
、AbstractChildWatcher
和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 中貢獻。)
collections.abc
: 已棄用ByteString
。 建議使用Sequence
或Buffer
。 對於型別提示,建議使用聯合型別,如bytes | bytearray
,或collections.abc.Buffer
。(由 Shantanu Jain 在 gh-91896 中貢獻。)email
: 棄用了email.utils.localtime()
中的 isdst 引數。(由 Alan Williams 在 gh-72346 中貢獻。)importlib.abc
棄用類importlib.abc.ResourceReader
importlib.abc.Traversable
importlib.abc.TraversableResources
請改用
importlib.resources.abc
類(由 Jason R. Coombs 和 Hugo van Kemenade 在 gh-93963 中貢獻。)
itertools
對 copy、deepcopy 和 pickle 操作的支援是未文件化、效率低下、歷史上存在 bug 且不一致的。 為了大幅減少程式碼量和維護負擔,此支援將在 3.14 中移除。(由 Raymond Hettinger 在 gh-101588 中貢獻。)multiprocessing
: 在 Linux、BSDs 和其他非 macOS POSIX 平臺上,預設啟動方法將更改為更安全的方法,其中當前'fork'
是預設方法 (gh-84559)。 新增關於此的執行時警告被認為太具破壞性,因為大多數程式碼預計不會在意。 如果你的程式碼需要'fork'
,請使用get_context()
或set_start_method()
API 來顯式指定。 請參閱 上下文和啟動方法。pathlib
:is_relative_to()
和relative_to()
: 傳遞額外的引數已被棄用。pkgutil
:find_loader()
和get_loader()
現在會引發DeprecationWarning
;請改用importlib.util.find_spec()
。(由 Nikita Sobolev 在 gh-97850 中貢獻。)pty
:master_open()
: 請使用pty.openpty()
。slave_open()
: 請使用pty.openpty()
。
-
如果使用 命名佔位符 並且 parameters 是序列而不是
dict
,則execute()
和executemany()
。
typing
:ByteString
自 Python 3.9 起已被棄用,現在在使用時會發出DeprecationWarning
。urllib
:urllib.parse.Quoter
已被棄用:它不應作為公共 API。(由 Gregory P. Smith 在 gh-88168 中貢獻。)
計劃在 Python 3.15 中移除¶
匯入系統
在未能設定
__spec__.cached
的情況下在模組上設定__cached__
已被棄用。 在 Python 3.15 中,匯入系統或標準庫將停止設定或考慮__cached__
。(gh-97879)在未能設定
__spec__.parent
的情況下在模組上設定__package__
已被棄用。 在 Python 3.15 中,匯入系統或標準庫將停止設定或考慮__package__
。(gh-97879)
-
未文件化的
ctypes.SetPointerType()
函式自 Python 3.13 起已被棄用。
-
自 Python 3.13 起,過時且很少使用的
CGIHTTPRequestHandler
已被棄用。 沒有直接的替代品。 任何東西都比 CGI 更好,可以將 Web 伺服器與請求處理程式連線起來。自 Python 3.13 起,python -m http.server 命令列介面的
--cgi
標誌已被棄用。
-
自 Python 3.11 起,
getdefaultlocale()
函式已被棄用。其移除最初計劃在 Python 3.13 中進行 (gh-90817),但已推遲至 Python 3.15。請改用getlocale()
、setlocale()
和getencoding()
。(由 Hugo van Kemenade 在 gh-111187 中貢獻。)
-
自 Python 3.13 起,
PurePath.is_reserved()
已被棄用。請使用os.path.isreserved()
來檢測 Windows 上的保留路徑。
-
自 Python 3.13 起,
java_ver()
已被棄用。此函式僅對 Jython 支援有用,具有令人困惑的 API,並且基本上未經測試。
-
RLock()
在 Python 3.15 中將不接受任何引數。自 Python 3.14 起,傳遞任何引數都已被棄用,因為 Python 版本不允許任何引數,但 C 版本允許任何數量的位置引數或關鍵字引數,並忽略每個引數。
-
types.CodeType
: 訪問co_lnotab
在 PEP 626 中自 3.10 起已棄用,並計劃在 3.12 中刪除,但它僅在 3.12 中獲得了正確的DeprecationWarning
。可能會在 3.15 中刪除。(由 Nikita Sobolev 在 gh-101866 中貢獻。)
-
用於建立
NamedTuple
類的未文件化的關鍵字引數語法(例如Point = NamedTuple("Point", x=int, y=int)
)自 Python 3.13 起已被棄用。請改用基於類的語法或函式式語法。自 Python 3.13 起,
typing.no_type_check_decorator()
裝飾器函式已被棄用。在typing
模組中存在八年後,它仍然未被任何主要的型別檢查器支援。
wave
:getmark()
、setmark()
和getmarkers()
方法,它們屬於Wave_read
和Wave_write
類,自 Python 3.13 起已被棄用。
計劃在 Python 3.16 中移除¶
匯入系統
在未能設定
__spec__.loader
的同時設定模組的__loader__
已被棄用。在 Python 3.16 中,匯入系統或標準庫將不再設定或考慮__loader__
。
-
自 Python 3.3 起,文件中已棄用
'u'
格式程式碼 (wchar_t
),自 Python 3.13 起,執行時已棄用。請改用'w'
格式程式碼 (Py_UCS4
) 來表示 Unicode 字元。
-
asyncio.iscoroutinefunction()
已被棄用,將在 Python 3.16 中刪除,請改用inspect.iscoroutinefunction()
。(由 Jiahao Li 和 Kumar Aditya 在 gh-122875 中貢獻。)
-
對布林型別進行按位反轉,例如
~True
或~False
,自 Python 3.12 起已被棄用,因為它會產生令人驚訝且不直觀的結果(-2
和-1
)。對於布林值的邏輯非,請改用not x
。在極少數情況下,如果您需要底層整數的按位反轉,請顯式轉換為int
(~int(x)
)。
-
自 Python 3.14 起,
ExecError
異常已被棄用。自 Python 3.4 以來,shutil
中的任何函式都沒有使用它,現在它是RuntimeError
的別名。
-
自 Python 3.14 起,
Class.get_methods
方法已被棄用。
sys
:自 Python 3.13 起,
_enablelegacywindowsfsencoding()
函式已被棄用。請改用PYTHONLEGACYWINDOWSFSENCODING
環境變數。
-
自 Python 3.13 起,未文件化且未使用的
TarFile.tarfile
屬性已被棄用。
計劃在未來版本中移除¶
以下 API 將在未來刪除,但目前尚未安排刪除日期。
argparse
:巢狀引數組和巢狀互斥組已被棄用。-
bool(NotImplemented)
.生成器:
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
的嚴格子類的例項。將
int()
的呼叫委託給__trunc__()
方法。現在不建議將複數作為
complex()
建構函式中的 *real* 或 *imag* 引數傳遞;它應該只作為單個位置引數傳遞。(由 Serhiy Storchaka 在 gh-109218 中貢獻。)
calendar
:calendar.January
和calendar.February
常量已棄用,並由calendar.JANUARY
和calendar.FEBRUARY
替代。(由 Prince Roshan 在 gh-103636 中貢獻。)codeobject.co_lnotab
:請使用codeobject.co_lines()
方法代替。-
utcnow()
:請使用datetime.datetime.now(tz=datetime.UTC)
。utcfromtimestamp()
:請使用datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)
。
gettext
:複數形式的值必須是整數。-
load_module()
方法:請使用exec_module()
代替。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
選項和協議不帶 protocol 引數的
ssl.SSLContext
已棄用。ssl.SSLContext
:set_npn_protocols()
和selected_npn_protocol()
已棄用:請使用 ALPN 代替。ssl.OP_NO_SSL*
選項ssl.OP_NO_TLS*
選項ssl.PROTOCOL_SSLv3
ssl.PROTOCOL_TLS
ssl.PROTOCOL_TLSv1
ssl.PROTOCOL_TLSv1_1
ssl.PROTOCOL_TLSv1_2
ssl.TLSVersion.SSLv3
ssl.TLSVersion.TLSv1
ssl.TLSVersion.TLSv1_1
sysconfig.is_python_build()
的 *check_home* 引數已棄用並被忽略。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()
。
unittest.IsolatedAsyncioTestCase
:從測試用例返回值(不是None
)已棄用。urllib.parse
中已棄用的函式:請使用urlparse()
代替。splitattr()
splithost()
splitnport()
splitpasswd()
splitport()
splitquery()
splittag()
splittype()
splituser()
splitvalue()
to_bytes()
urllib.request
:呼叫請求的URLopener
和FancyURLopener
樣式已被棄用。請使用較新的urlopen()
函式和方法。wsgiref
:SimpleHandler.stdout.write()
不應進行部分寫入。xml.etree.ElementTree
:測試Element
的真值已被棄用。在未來的版本中,它將始終返回True
。請首選顯式的len(elem)
或elem is not None
測試。
已移除¶
asynchat 和 asyncore¶
configparser¶
早在 3.2 版本中
configparser
中棄用的幾個名稱已根據 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
基(和distutils
基)的包仍然可以與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_cache
中imp.cache_from_source()
imp.find_module()
imp.get_magic()
imp.get_suffixes()
importlib.machinery.SOURCE_SUFFIXES
、importlib.machinery.EXTENSION_SUFFIXES
和importlib.machinery.BYTECODE_SUFFIXES
imp.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
如果必須使用共享快取,請使用
cache=shared
查詢引數以 URI 模式開啟資料庫。自 Python 3.3 以來,
sqlite3.OptimizedUnicode
文字工廠一直是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 中已棄用。自 Python 3.7 以來,OpenSSL 執行主機名匹配,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
方法別名已棄用的別名
方法名稱
已棄用版本
failUnless
3.1
failIf
3.1
failUnlessEqual
3.1
failIfEqual
3.1
failUnlessAlmostEqual
3.1
failIfAlmostEqual
3.1
failUnlessRaises
3.1
assert_
3.2
assertEquals
3.2
assertNotEquals
3.2
assertAlmostEquals
3.2
assertNotAlmostEquals
3.2
assertRegexpMatches
3.2
assertRaisesRegexp
3.2
assertNotRegexpMatches
3.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 和 35 及以下版本的 Firefox ( 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 中貢獻。)從多個 stdlib 模組和測試中刪除
Jython
相容性 hack。(由 Nikita Sobolev 在 gh-99482 中貢獻。)從
ctypes
模組中移除_use_broken_old_ctypes_structure_semantics_
標誌。(由 Nikita Sobolev 在 gh-99285 中貢獻。)
移植到 Python 3.12¶
本節列出了先前描述的更改和其他錯誤修復,這些更改可能需要您修改程式碼。
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 中描述的標記:除了表示式元件中標記化的相應標記外,現在還會為 f 字串的“字串”部分發出FSTRING_START
、FSTRING_MIDDLE
和FSTRING_END
。 例如,對於 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
變數以覆蓋compileall
選項(預設值:-j0
),用於make install
。 還將 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 中貢獻。)添加了新的函式
PyFunction_SetVectorcall()
到 C API,它設定給定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_IMMORTAL_REFCNT
當與Py_BUILD_CORE
一起使用時。
SSTATE_INTERNED_IMMORTAL
不朽的 interned unicode 物件的識別符號。是不朽的。
SSTATE_INTERNED_IMMORTAL_STATIC
不朽且靜態的 interned unicode 物件的識別符號是靜態的
sys.getunicodeinternedsize
這將返回已 interned 的 unicode 物件總數。現在需要這樣做,以便
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_t
C 字串、可變寬度和精度)。(由 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 中貢獻。Ken Jin 的 PEP。)棄用全域性配置變數
Py_HashRandomizationFlag
: 使用PyConfig.use_hash_seed
和PyConfig.hash_seed
Py_LegacyWindowsFSEncodingFlag
: 使用PyPreConfig.legacy_windows_fs_encoding
Py_FileSystemDefaultEncoding
: 使用PyConfig.filesystem_encoding
Py_HasFileSystemDefaultEncoding
: 使用PyConfig.filesystem_encoding
Py_FileSystemDefaultEncodeErrors
: 使用PyConfig.filesystem_errors
Py_UTF8Mode
: 使用PyPreConfig.utf8_mode
(請參閱Py_PreInitialize()
)
應該將
Py_InitializeFromConfig()
API 與PyConfig
一起使用。(由 Victor Stinner 在 gh-77782 中貢獻。)使用可變基類建立
immutable types
已被棄用,將在 Python 3.14 中停用。(gh-95388)structmember.h
標頭已棄用,但它將繼續可用,並且沒有計劃將其刪除。現在只需包含
Python.h
即可使用其內容,如果缺少Py
字首,則會新增該字首型別宏,如
Py_T_INT
,Py_T_DOUBLE
等(以前為T_INT
,T_DOUBLE
等)標誌
Py_READONLY
(以前為READONLY
)和Py_AUDIT_READ
(以前全部為大寫)
有些項沒有從
Python.h
中公開T_NONE
(以前未記錄,而且非常奇怪)不做任何事的宏
WRITE_RESTRICTED
。宏
RESTRICTED
和READ_RESTRICTED
,相當於Py_AUDIT_READ
。在某些配置中,
Python.h
中不包含<stddef.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 初始化的函式,在 Python 3.11 中已棄用
PySys_SetArgvEx()
: 請改用設定PyConfig.argv
。PySys_SetArgv()
: 請改用設定PyConfig.argv
。Py_SetProgramName()
: 請改用設定PyConfig.program_name
。Py_SetPythonHome()
: 請改用設定PyConfig.home
。
應該將
Py_InitializeFromConfig()
API 與PyConfig
一起使用。全域性配置變數
Py_QuietFlag
: 請改用PyConfig.quiet
。Py_HashRandomizationFlag
: 請改用PyConfig.use_hash_seed
和PyConfig.hash_seed
。Py_LegacyWindowsFSEncodingFlag
: 請改用PyPreConfig.legacy_windows_fs_encoding
。Py_LegacyWindowsStdioFlag
: 請改用PyConfig.legacy_windows_stdio
。Py_FileSystemDefaultEncoding
: 請改用PyConfig.filesystem_encoding
。Py_HasFileSystemDefaultEncoding
: 請改用PyConfig.filesystem_encoding
。Py_FileSystemDefaultEncodeErrors
: 請改用PyConfig.filesystem_errors
。Py_UTF8Mode
: 請改用PyPreConfig.utf8_mode
。(請參閱Py_PreInitialize()
)
應該將
Py_InitializeFromConfig()
API 與PyConfig
一起使用。
Python 3.15 中待移除¶
捆綁的
libmpdecimal
副本。PyWeakref_GetObject()
和PyWeakref_GET_OBJECT()
:請改用PyWeakref_GetRef()
。Py_UNICODE
型別和Py_UNICODE_WIDE
宏:請改用wchar_t
。Python 初始化函式
PySys_ResetWarnOptions()
:請改為清除sys.warnoptions
和warnings.filters
。Py_GetExecPrefix()
:請改為獲取sys.base_exec_prefix
和sys.exec_prefix
。Py_GetPath()
:請改為獲取sys.path
。Py_GetPrefix()
:請改為獲取sys.base_prefix
和sys.prefix
。Py_GetPythonHome()
:請改為獲取PyConfig.home
或PYTHONHOME
環境變數。
未來版本中待移除項¶
以下 API 已被棄用,將被移除,儘管目前尚未安排移除的日期。
Py_TPFLAGS_HAVE_FINALIZE
:自 Python 3.8 起不再需要。PySlice_GetIndicesEx()
:請改用PySlice_Unpack()
和PySlice_AdjustIndices()
。PyUnicode_AsDecodedObject()
:請改用PyCodec_Decode()
。PyUnicode_AsDecodedUnicode()
:請改用PyCodec_Decode()
。PyUnicode_AsEncodedObject()
:請改用PyCodec_Encode()
。PyUnicode_AsEncodedUnicode()
:請改用PyCodec_Encode()
。PyUnicode_READY()
:自 Python 3.12 起不再需要。PyErr_Display()
:請改用PyErr_DisplayException()
。_PyErr_ChainExceptions()
:請改用_PyErr_ChainExceptions1()
。PyBytesObject.ob_shash
成員:請改為呼叫PyObject_Hash()
。PyDictObject.ma_version_tag
成員。執行緒本地儲存 (TLS) API
已移除項¶
移除
token.h
標頭檔案。從來沒有任何公共的詞法分析器 C API。token.h
標頭檔案僅供 Python 內部使用。(由 Victor Stinner 在 gh-92651 中貢獻。)已移除舊版的 Unicode API。 請參閱 PEP 623 瞭解詳情。
PyUnicode_WCHAR_KIND
PyUnicode_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 中貢獻。)