Python 3.13 有哪些新功能¶
- 編輯:
Adam Turner 和 Thomas Wouters
本文解釋了 Python 3.13 相對於 3.12 的新功能。Python 3.13 於 2024 年 10 月 7 日釋出。有關完整詳細資訊,請參閱更新日誌。
參見
PEP 719 – Python 3.13 釋出計劃
總結 – 釋出亮點¶
Python 3.13 是 Python 程式語言的一個穩定版本,其中混合了對語言、實現和標準庫的更改。最大的變化包括新的互動式直譯器、在自由執行緒模式下執行的實驗性支援(PEP 703)以及即時編譯器(PEP 744)。
錯誤訊息繼續改進,預設情況下回溯現在以顏色突出顯示。locals()
內建函式現在具有用於更改返回對映的定義語義,並且型別引數現在支援預設值。
庫的更改包括刪除已棄用的 API 和模組,以及對使用者友好性和正確性的常規改進。繼 Python 3.11 中棄用後(PEP 594),幾個遺留的標準庫模組現已被移除。
本文不試圖提供所有新功能的完整規範,而是提供一個方便的概述。有關完整詳細資訊,請參閱文件,例如庫參考和語言參考。要了解更改的完整實現和設計原理,請參閱特定新功能的 PEP;但請注意,一旦功能完全實現,PEP 通常不會保持最新。有關從早期 Python 版本升級的指南,請參閱移植到 Python 3.13。
直譯器的改進
PEP 667:在修改返回對映時,內建函式
locals()
現在具有已定義語義。Python 偵錯程式和類似工具現在即使在併發程式碼執行期間也能更可靠地更新最佳化範圍中的區域性變數。PEP 703:CPython 3.13 實驗性支援在停用全域性直譯器鎖的情況下執行。有關更多詳細資訊,請參閱自由執行緒 CPython。
PEP 744:添加了一個基本的JIT 編譯器。它目前預設停用(儘管我們可能會在以後啟用它)。效能提升適中——我們預計在接下來的幾個版本中會改進這一點。
新互動式直譯器中的顏色支援,以及回溯和doctest輸出中的顏色支援。這可以透過
PYTHON_COLORS
和NO_COLOR
環境變數停用。
Python 資料模型改進
__static_attributes__
儲存類體中任何函式中透過self.X
訪問的屬性名稱。__firstlineno__
記錄類定義的第一個行號。
標準庫的重大改進
新增一個新的
PythonFinalizationError
異常,當操作在直譯器關閉期間被阻塞時引發。argparse
模組現在支援棄用命令列選項、位置引數和子命令。新函式
base64.z85encode()
和base64.z85decode()
支援編碼和解碼 Z85 資料。copy
模組現在有一個copy.replace()
函式,支援許多內建型別和任何定義__replace__()
方法的類。新的
dbm.sqlite3
模組現在是預設的dbm
後端。
安全改進
C API 的改進
Py_mod_gil
插槽現在用於指示擴充套件模組支援在停用GIL 的情況下執行。PyTime C API 已新增,提供對系統時鐘的訪問。
PyMutex
是一個新的輕量級互斥鎖,佔用一個位元組。
新的型別特性
PEP 696:型別引數(
typing.TypeVar
、typing.ParamSpec
和typing.TypeVarTuple
)現在支援預設值。PEP 702:新的
warnings.deprecated()
裝飾器添加了對在型別系統和執行時標記棄用的支援。PEP 705:
typing.ReadOnly
可用於將typing.TypedDict
的項標記為型別檢查器的只讀項。PEP 742:
typing.TypeIs
作為typing.TypeGuard
的替代方案,提供更直觀的型別縮小行為。
平臺支援
wasm32-wasi
現在被支援為Tier 2 平臺。wasm32-emscripten
不再是官方支援的平臺。
重要移除
PEP 594:剩餘的 19 個“廢棄的模組”(遺留標準庫模組)已從標準庫中移除:
aifc
、audioop
、cgi
、cgitb
、chunk
、crypt
、imghdr
、mailcap
、msilib
、nis
、nntplib
、ossaudiodev
、pipes
、sndhdr
、spwd
、sunau
、telnetlib
、uu
和xdrlib
。移除 2to3 工具和
lib2to3
模組(在 Python 3.11 中已棄用)。移除
tkinter.tix
模組(在 Python 3.6 中已棄用)。移除
locale.resetlocale()
函式。移除
typing.io
和typing.re
名稱空間。移除鏈式
classmethod
描述符。
釋出計劃變更
PEP 602(“Python 年度釋出週期”)已更新,將新版本的完全支援(“bugfix”)期限延長至兩年。此更新的策略意味著:
Python 3.9–3.12 有一年半的完全支援,隨後是三年半的安全修復。
Python 3.13 及更高版本有兩年的完全支援,隨後是三年的安全修復。
新功能¶
一個更好的互動式直譯器¶
Python 現在預設使用基於 PyPy 專案程式碼的新互動式 shell。當用戶從互動式終端啟動 REPL 時,現在支援以下新功能:
多行編輯並保留歷史記錄。
直接支援 REPL 特定命令,如 help、exit 和 quit,無需將其作為函式呼叫。
提示符和回溯預設啟用顏色。
使用 F1 進行互動式幫助瀏覽,並帶有單獨的命令歷史記錄。
使用 F3 的“貼上模式”使貼上更大的程式碼塊更容易(再次按 F3 返回到常規提示符)。
要停用新的互動式 shell,請設定 PYTHON_BASIC_REPL
環境變數。有關互動模式的更多資訊,請參閱互動模式。
(由 Pablo Galindo Salgado、Łukasz Langa 和 Lysandros Nikolaou 在 gh-111201 中貢獻,基於 PyPy 專案的程式碼。Windows 支援由 Dino Viehland 和 Anthony Shaw 貢獻。)
改進的錯誤訊息¶
直譯器現在預設在終端顯示回溯時使用顏色。此功能可以透過新的
PYTHON_COLORS
環境變數以及規範的NO_COLOR
和FORCE_COLOR
環境變數進行控制。(由 Pablo Galindo Salgado 在 gh-112730 中貢獻。)一個常見的錯誤是編寫與標準庫模組同名的指令碼。當這導致錯誤時,我們現在顯示更友好的錯誤訊息:
$ python random.py Traceback (most recent call last): File "/home/me/random.py", line 1, in <module> import random File "/home/me/random.py", line 3, in <module> print(random.randint(5)) ^^^^^^^^^^^^^^ AttributeError: module 'random' has no attribute 'randint' (consider renaming '/home/me/random.py' since it has the same name as the standard library module named 'random' and prevents importing that standard library module)
類似地,如果指令碼與它嘗試匯入的第三方模組同名,並且這導致錯誤,我們也會顯示更友好的錯誤訊息:
$ python numpy.py Traceback (most recent call last): File "/home/me/numpy.py", line 1, in <module> import numpy as np File "/home/me/numpy.py", line 3, in <module> np.array([1, 2, 3]) ^^^^^^^^ AttributeError: module 'numpy' has no attribute 'array' (consider renaming '/home/me/numpy.py' if it has the same name as a library you intended to import)
(由 Shantanu Jain 在 gh-95754 中貢獻。)
當向函式傳遞不正確的關鍵字引數時,錯誤訊息現在嘗試建議正確的關鍵字引數。
>>> "Better error messages!".split(max_split=1) Traceback (most recent call last): File "<python-input-0>", line 1, in <module> "Better error messages!".split(max_split=1) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^ TypeError: split() got an unexpected keyword argument 'max_split'. Did you mean 'maxsplit'?
(由 Pablo Galindo Salgado 和 Shantanu Jain 在 gh-107944 中貢獻。)
自由執行緒的 CPython¶
CPython 現在實驗性支援在停用全域性直譯器鎖 (GIL) 的自由執行緒模式下執行。這是一個實驗性功能,因此預設情況下未啟用。自由執行緒模式需要一個不同的可執行檔案,通常稱為 python3.13t
或 python3.13t.exe
。標記為 free-threaded 的預構建二進位制檔案可以作為官方 Windows 和 macOS 安裝程式的一部分安裝,或者可以使用 --disable-gil
選項從原始碼構建 CPython。
自由執行緒執行允許透過在可用 CPU 核心上並行執行執行緒來充分利用可用的處理能力。雖然並非所有軟體都會自動從中受益,但考慮到執行緒設計的程式在多核硬體上會執行得更快。自由執行緒模式是實驗性的,改進工作正在進行中:預計會有一些錯誤和顯著的單執行緒效能損失。CPython 的自由執行緒構建支援在執行時使用環境變數 PYTHON_GIL
或命令列選項 -X gil=1
可選地啟用 GIL。
要檢查當前直譯器是否支援自由執行緒,python -VV
和 sys.version
包含“experimental free-threading build”。新的 sys._is_gil_enabled()
函式可用於檢查執行程序中 GIL 是否實際停用。
C-API 擴充套件模組需要專門為自由執行緒構建而構建。支援在停用 GIL 的情況下執行的擴充套件應使用 Py_mod_gil
插槽。使用單階段初始化的擴充套件應使用 PyUnstable_Module_SetGIL()
來指示它們是否支援在停用 GIL 的情況下執行。匯入不使用這些機制的 C 擴充套件將導致 GIL 被啟用,除非使用 PYTHON_GIL
環境變數或 -X gil=0
選項明確停用 GIL。在自由執行緒構建中安裝包含 C 擴充套件的包需要 pip 24.1 或更高版本。
這項工作得益於許多個人和組織,包括 Python 貢獻者社群以及第三方專案,他們測試並啟用了自由執行緒支援。值得注意的貢獻者包括:Sam Gross、Ken Jin、Donghee Na、Itamar Oren、Matt Page、Brett Simmers、Dino Viehland、Carl Meyer、Nathan Goldbaum、Ralf Gommers、Lysandros Nikolaou 等等。許多這些貢獻者受僱於 Meta,Meta 為支援此專案提供了大量的工程資源。
一個實驗性的即時 (JIT) 編譯器¶
當使用 --enable-experimental-jit
選項配置和構建 CPython 時,會新增一個即時 (JIT) 編譯器,它可以加速一些 Python 程式。在 Windows 上,使用 PCbuild/build.bat --experimental-jit
啟用 JIT 或 --experimental-jit-interpreter
啟用 Tier 2 直譯器。構建要求和更多支援資訊包含在 Tools/jit/README.md
中。
--enable-experimental-jit
選項接受這些(可選)值,如果存在 --enable-experimental-jit
而沒有可選值,則預設為 yes
。
no
:停用整個 Tier 2 和 JIT 管道。yes
:啟用 JIT。要在執行時停用 JIT,請傳遞環境變數PYTHON_JIT=0
。yes-off
:構建 JIT 但預設停用。要在執行時啟用 JIT,請傳遞環境變數PYTHON_JIT=1
。interpreter
:啟用 Tier 2 直譯器但停用 JIT。直譯器可以透過執行PYTHON_JIT=0
來停用。
內部架構大致如下:
我們從專門的 Tier 1 位元組碼 開始。有關詳細資訊,請參閱3.11 新功能。
當 Tier 1 位元組碼足夠“熱”時,它會被翻譯成一個新的純內部中間表示 (IR),稱為 Tier 2 IR,有時也稱為微操作碼 (“uops”)。
Tier 2 IR 使用與 Tier 1 相同的基於堆疊的虛擬機器,但指令格式更適合翻譯成機器碼。
我們對 Tier 2 IR 有多個最佳化階段,這些階段在解釋或翻譯成機器碼之前應用。
有一個 Tier 2 直譯器,但它主要用於除錯最佳化管道的早期階段。Tier 2 直譯器可以透過使用
--enable-experimental-jit=interpreter
配置 Python 來啟用。啟用 JIT 後,最佳化後的 Tier 2 IR 將被翻譯成機器碼,然後執行。
機器碼翻譯過程使用一種稱為 複製-修補 的技術。它沒有執行時依賴,但新增了對 LLVM 的構建時依賴。
參見
(JIT 由 Brandt Bucher 貢獻,靈感來自 Haoran Xu 和 Fredrik Kjolstad 的論文。Tier 2 IR 由 Mark Shannon 和 Guido van Rossum 貢獻。Tier 2 最佳化器由 Ken Jin 貢獻。)
為 locals()
定義了變異語義¶
從歷史上看,修改 locals()
返回值的預期結果已留給各個 Python 實現來定義。從 Python 3.13 開始,PEP 667 將 CPython 在大多數程式碼執行範圍內的歷史行為標準化,但將最佳化範圍(函式、生成器、協程、推導式和生成器表示式)更改為明確返回當前分配的區域性變數的獨立快照,包括在閉包中捕獲的區域性引用的非區域性變數。
這一對最佳化範圍中 locals()
語義的更改也影響了隱式以 locals()
為目標的程式碼執行函式的預設行為,如果未提供顯式名稱空間(例如 exec()
和 eval()
)。在以前的版本中,呼叫程式碼執行函式後是否可以透過呼叫 locals()
訪問更改取決於實現。特別是在 CPython 中,此類程式碼通常會按預期工作,但有時可能會由於其他程式碼(包括偵錯程式和程式碼執行跟蹤工具)可能重置該範圍內的共享快照而在最佳化範圍中失敗。現在,程式碼將始終針對最佳化範圍中區域性變數的獨立快照執行,因此在後續呼叫 locals()
時,這些更改將永遠不可見。要訪問在這些情況下所做的更改,現在必須將顯式名稱空間引用傳遞給相關函式。或者,更新受影響的程式碼以使用返回結果程式碼執行名稱空間的高階程式碼執行 API 可能有意義(例如,從磁碟執行 Python 檔案時使用 runpy.run_path()
)。
為了確保偵錯程式和類似工具能夠可靠地更新受此更改影響的範圍中的區域性變數,FrameType.f_locals
現在返回一個可寫入的代理,指向這些範圍中的幀的區域性變數和區域性引用的非區域性變數,而不是返回一個不一致更新的共享 dict
例項,該例項具有未定義的執行時語義。
有關更多詳細資訊,包括相關的 C API 更改和棄用,請參閱PEP 667。下面還提供了受影響的 Python API 和 C API 的移植說明。
(PEP 和實現由 Mark Shannon 和 Tian Gao 在 gh-74929 中貢獻。文件更新由 Guido van Rossum 和 Alyssa Coghlan 提供。)
支援移動平臺¶
PEP 730:iOS 現在是PEP 11 支援的平臺,arm64-apple-ios
和 arm64-apple-ios-simulator
目標位於 Tier 3(分別指 2013 年後釋出的 iPhone 和 iPad 裝置以及在 Apple 晶片硬體上執行的 Xcode iOS 模擬器)。x86_64-apple-ios-simulator
(在舊 x86_64
硬體上執行的 Xcode iOS 模擬器)不是 Tier 3 支援的平臺,但將獲得盡力支援。(PEP 由 Russell Keith-Magee 編寫並貢獻實現,見 gh-114099。)
PEP 738:Android 現在是PEP 11 支援的平臺,aarch64-linux-android
和 x86_64-linux-android
目標位於 Tier 3。32 位目標 arm-linux-androideabi
和 i686-linux-android
不是 Tier 3 支援的平臺,但將獲得盡力支援。(PEP 由 Malcolm Smith 編寫並貢獻實現,見 gh-116622。)
其他語言更改¶
編譯器現在從 docstring 的每一行中剝離常見的開頭空白。這減少了位元組碼快取的大小(例如
.pyc
檔案),例如在 SQLAlchemy 2.0 中的sqlalchemy.orm.session
中,檔案大小減少了大約 5%。此更改會影響使用 docstring 的工具,例如doctest
。>>> def spam(): ... """ ... This is a docstring with ... leading whitespace. ... ... It even has multiple paragraphs! ... """ ... >>> spam.__doc__ '\nThis is a docstring with\n leading whitespace.\n\nIt even has multiple paragraphs!\n'
(由 Inada Naoki 在 gh-81283 中貢獻。)
類範圍內的註釋範圍現在可以包含 lambda 和推導式。位於類範圍內的推導式不會內聯到其父範圍。
class C[T]: type Alias = lambda: T
Future 語句不再由
__future__
模組的相對匯入觸發,這意味著形式為from .__future__ import ...
的語句現在只是標準的相對匯入,沒有啟用特殊功能。(由 Jeremiah Gabriel Pascual 在 gh-118216 中貢獻。)global
宣告現在允許在except
塊中使用,當該全域性變數在else
塊中使用時。以前這會引發錯誤的SyntaxError
。(由 Irit Katriel 在 gh-111123 中貢獻。)新增
PYTHON_FROZEN_MODULES
,這是一個新的環境變數,用於確定匯入機制是否忽略凍結模組,等同於-X frozen_modules
命令列選項。(由 Yilei Yang 在 gh-111374 中貢獻。)新增對 perf 分析器的支援,使其在沒有幀指標的情況下工作,透過新的環境變數
PYTHON_PERF_JIT_SUPPORT
和命令列選項-X perf_jit
。(由 Pablo Galindo 在 gh-118518 中貢獻。).python_history
檔案的位置可以透過新的PYTHON_HISTORY
環境變數更改。(由 Levi Sabah、Zackery Spytz 和 Hugo van Kemenade 在 gh-73965 中貢獻。)類有一個新的
__static_attributes__
屬性。這由編譯器填充一個元組,其中包含類的屬性名稱,這些屬性名稱透過其正文中的任何函式中的self.<name>
賦值。(由 Irit Katriel 在 gh-115775 中貢獻。)編譯器現在在類上建立
__firstlineno__
屬性,其值為類定義的第一個行號。(由 Serhiy Storchaka 在 gh-118465 中貢獻。)exec()
和eval()
內建函式現在接受 globals 和 locals 引數作為關鍵字引數。(由 Raphael Gaschignard 在 gh-105879 中貢獻)內建函式
compile()
現在接受一個新標誌ast.PyCF_OPTIMIZED_AST
,它類似於ast.PyCF_ONLY_AST
,不同之處在於返回的 AST 根據 optimize 引數的值進行最佳化。(由 Irit Katriel 在 gh-108113 中貢獻)。在
property
物件上新增__name__
屬性。(由 Eugene Toder 在 gh-101860 中貢獻。)新增
PythonFinalizationError
,這是一個新的異常,派生自RuntimeError
,用於在直譯器終止期間操作被阻塞時發出訊號。以下可呼叫物件現在會引發PythonFinalizationError
,而不是RuntimeError
:(由 Victor Stinner 在 gh-114570 中貢獻。)
允許
str.replace()
的 count 引數為關鍵字引數。(由 Hugo van Kemenade 在 gh-106487 中貢獻。)現在,如果布林值作為檔案描述符引數傳遞,許多函式都會發出警告。這有助於更早地發現一些錯誤。(由 Serhiy Storchaka 在 gh-82626 中貢獻。)
在
bz2
、lzma
、tarfile
和zipfile
模組中,為壓縮和存檔的類檔案物件添加了name
和mode
屬性。(由 Serhiy Storchaka 在 gh-115961 中貢獻。)
新模組¶
dbm.sqlite3
:dbm 的 SQLite 後端。(由 Raymond Hettinger 和 Erlend E. Aasland 在 gh-100414 中貢獻。)
改進的模組¶
argparse¶
在
add_argument()
和add_parser()
方法中添加了 deprecated 引數,以啟用棄用命令列選項、位置引數和子命令。(由 Serhiy Storchaka 在 gh-83648 中貢獻。)
array¶
添加了 Unicode 字元的
'w'
型別程式碼(Py_UCS4
)。它應該用於代替已棄用的'u'
型別程式碼。(由 Inada Naoki 在 gh-80480 中貢獻。)透過實現
clear()
方法,將array.array
註冊為MutableSequence
。(由 Mike Zimin 在 gh-114894 中貢獻。)
ast¶
ast
模組中節點型別的建構函式現在對其接受的引數更加嚴格,並且在省略引數時具有更直觀的行為。如果 AST 節點上的可選欄位在構造例項時未作為引數包含,則該欄位現在將設定為
None
。類似地,如果省略列表欄位,則該欄位現在將設定為空列表;如果省略expr_context
欄位,則其預設值為Load()
。(以前,在所有情況下,新構造的 AST 節點例項上都會缺少該屬性。)在所有其他情況下,如果省略了必需引數,則節點建構函式將發出
DeprecationWarning
。這將在 Python 3.15 中引發異常。類似地,向建構函式傳遞不對映到 AST 節點上欄位的關鍵字引數現在已棄用,並將在 Python 3.15 中引發異常。這些更改不適用於
ast.AST
的使用者定義子類,除非該類透過定義AST._field_types
對映來選擇新行為。ast.parse()
現在接受一個可選引數 optimize,該引數會傳遞給compile()
。這使得獲取最佳化後的 AST 成為可能。(由 Irit Katriel 在 gh-108113 中貢獻。)
asyncio¶
asyncio.as_completed()
現在返回一個既是非同步迭代器又是普通可迭代物件,其中包含可等待物件。非同步迭代產生的可等待物件包括傳入的原始任務或 Future 物件,從而更容易將結果與正在完成的任務關聯起來。(由 Justin Arthur 在 gh-77714 中貢獻。)asyncio.loop.create_unix_server()
現在會在伺服器關閉時自動移除 Unix 套接字。(由 Pierre Ossman 在 gh-111246 中貢獻。)DatagramTransport.sendto()
現在在呼叫空位元組物件時將傳送零長度資料報。傳輸流控制現在在計算緩衝區大小時也會考慮資料報頭。(由 Jamie Phan 在 gh-115199 中貢獻。)新增
Queue.shutdown
和QueueShutDown
以管理佇列終止。(由 Laurie Opperman 和 Yves Duprat 在 gh-104228 中貢獻。)新增
Server.close_clients()
和Server.abort_clients()
方法,它們更強制地關閉 asyncio 伺服器。(由 Pierre Ossman 在 gh-113538 中貢獻。)StreamReader.readuntil()
現在接受一個分隔符元組,在遇到其中任何一個時停止。(由 Bruce Merry 在 gh-81322 中貢獻。)改進
TaskGroup
在外部取消與內部取消衝突時的行為。例如,當兩個任務組巢狀並且兩者同時在子任務中發生異常時,外部任務組可能會掛起,因為其內部取消被內部任務組吞噬了。在任務組被外部取消並且還必須引發
ExceptionGroup
的情況下,它現在將呼叫父任務的cancel()
方法。這確保CancelledError
將在下一個await
處引發,因此取消不會丟失。這些更改的另一個好處是,任務組現在保留取消計數(
cancelling()
)。為了處理一些極端情況,當取消計數達到零時,
uncancel()
現在可能會重置未文件化的_must_cancel
標誌。(受 Arthur Tacca 在 gh-116720 中報告的問題啟發。)
當在非活動
TaskGroup
上呼叫TaskGroup.create_task()
時,給定的協程將被關閉(這可以防止關於給定協程從未等待的RuntimeWarning
)。(由 Arthur Tacca 和 Jason Zhang 在 gh-115957 中貢獻。)名為
create_task
的函式和方法已收到一個新的**kwargs
引數,該引數將傳遞給任務建構函式。此更改在 3.13.3 中意外新增,並破壞了自定義任務工廠的 API 約定。一些第三方任務工廠為此實現了變通方法。在 3.13.4 及更高版本中,舊的工廠約定再次得到遵守(直到 3.14)。為了使變通方法繼續工作,額外的**kwargs
引數仍然允許向Task
和自定義任務工廠傳遞額外的關鍵字引數。這會影響以下函式和方法:
asyncio.create_task()
、asyncio.loop.create_task()
、asyncio.TaskGroup.create_task()
。(由 Thomas Grainger 在 gh-128307 中貢獻。)
base64¶
新增
z85encode()
和z85decode()
函式,用於將bytes
編碼為 Z85 資料,並將 Z85 編碼資料解碼為bytes
。(由 Matan Perelman 在 gh-75299 中貢獻。)
compileall¶
現在使用
os.process_cpu_count()
而不是os.cpu_count()
選擇預設的 worker 執行緒和程序數。(由 Victor Stinner 在 gh-109649 中貢獻。)
concurrent.futures¶
現在使用
os.process_cpu_count()
而不是os.cpu_count()
選擇預設的 worker 執行緒和程序數。(由 Victor Stinner 在 gh-109649 中貢獻。)
configparser¶
ConfigParser
現在支援無名節,這允許頂級鍵值對。這可以透過新的 allow_unnamed_section 引數啟用。(由 Pedro Sousa Lacerda 在 gh-66449 中貢獻。)
copy¶
新的
replace()
函式和replace protocol
使建立修改後的物件副本變得簡單得多。這在處理不可變物件時特別有用。以下型別支援replace()
函式並實現了 replace 協議:任何使用者定義的類也可以透過定義
__replace__()
方法來支援copy.replace()
。(由 Serhiy Storchaka 在 gh-108751 中貢獻。)
ctypes¶
由於必要的內部重構,內部元類的初始化現在在
__init__
中發生,而不是在__new__
中。這會影響子類化這些內部元類以提供自定義初始化的專案。通常:在呼叫
super().__new__
之後在__new__
中完成的自定義邏輯應移至__init__
。要建立類,請呼叫元類,而不僅僅是元類的
__new__
方法。
有關一些受影響專案中的討論和更改連結,請參閱 gh-124520。
ctypes.Structure
物件有一個新的_align_
屬性,它允許明確指定結構從記憶體打包/解包時的對齊方式。(由 Matt Sanderson 在 gh-112433 中貢獻)
dbm¶
新增
dbm.sqlite3
,這是一個實現 SQLite 後端的新模組,並使其成為預設的dbm
後端。(由 Raymond Hettinger 和 Erlend E. Aasland 在 gh-100414 中貢獻。)允許透過 GDBM 和 NDBM 資料庫物件的新
clear()
方法從資料庫中刪除所有專案。(由 Donghee Na 在 gh-107122 中貢獻。)
dis¶
更改
dis
模組函式的輸出,以顯示跳轉目標和異常處理程式的邏輯標籤,而不是偏移量。偏移量可以使用新的-O
命令列選項或 show_offsets 引數新增。(由 Irit Katriel 在 gh-112137 中貢獻。)get_instructions()
不再將快取條目表示為單獨的指令。相反,它將它們作為Instruction
的一部分返回,在新的 cache_info 欄位中。傳遞給get_instructions()
的 show_caches 引數已棄用,並且不再有任何效果。(由 Irit Katriel 在 gh-112962 中貢獻。)
doctest¶
doctest
輸出現在預設有顏色。這可以透過新的PYTHON_COLORS
環境變數以及規範的NO_COLOR
和FORCE_COLOR
環境變數進行控制。另請參閱 控制顏色。(由 Hugo van Kemenade 在 gh-117225 中貢獻。)DocTestRunner.run()
方法現在計算跳過的測試數量。添加了DocTestRunner.skips
和TestResults.skipped
屬性。(由 Victor Stinner 在 gh-108794 中貢獻。)
email¶
現在,輸出中包含換行符的標頭將用引號括起來。
generator
現在將拒絕序列化(寫入)格式不正確或分隔不當的標頭,以免它們被解析為多個標頭或與相鄰資料連線。如果需要關閉此安全功能,請設定verify_generated_headers
。(由 Bas Bloemsaat 和 Petr Viktorin 在 gh-121650 中貢獻。)getaddresses()
和parseaddr()
現在在遇到無效電子郵件地址的更多情況下返回('', '')
對,而不是可能不準確的值。這兩個函式都有一個新的可選 strict 引數(預設為True
)。要獲取舊行為(接受格式錯誤輸入),請使用strict=False
。getattr(email.utils, 'supports_strict_parsing', False)
可用於檢查 strict 引數是否可用。(由 Thomas Dwyer 和 Victor Stinner 為 gh-102988 貢獻,以改進CVE 2023-27043 修復。)
enum¶
fractions¶
glob¶
新增
translate()
,一個用於將帶有 shell 風格萬用字元的路徑規範轉換為正則表示式的函式。(由 Barney Gale 在 gh-72904 中貢獻。)
importlib¶
importlib.resources
中的以下函式現在允許透過使用多個位置引數(文字讀取函式中的 encoding 和 errors 引數現在僅為關鍵字引數)訪問資源目錄(或樹)這些函式不再被棄用,並且沒有計劃移除。(由 Petr Viktorin 在 gh-116608 中貢獻。)
contents()
仍被棄用,轉而使用功能齊全的Traversable
API。然而,目前沒有計劃移除它。(由 Petr Viktorin 在 gh-116608 中貢獻。)
io¶
IOBase
終結器現在使用sys.unraisablehook
記錄close()
方法引發的任何錯誤。以前,預設情況下錯誤會被靜默忽略,並且只在 Python 開發模式 或使用 Python 除錯構建 時記錄。(由 Victor Stinner 在 gh-62948 中貢獻。)
ipaddress¶
新增
IPv4Address.ipv6_mapped
屬性,它返回 IPv4 對映的 IPv6 地址。(由 Charles Machalow 在 gh-109466 中貢獻。)修復
IPv4Address
、IPv6Address
、IPv4Network
和IPv6Network
中的is_global
和is_private
行為。(由 Jakub Stasiak 在 gh-113171 中貢獻。)
itertools¶
batched()
有一個新的 strict 引數,如果最終批次短於指定的批次大小,則會引發ValueError
。(由 Raymond Hettinger 在 gh-113202 中貢獻。)
marshal¶
在模組函式中新增 allow_code 引數。傳遞
allow_code=False
可防止序列化和反序列化在 Python 版本之間不相容的程式碼物件。(由 Serhiy Storchaka 在 gh-113626 中貢獻。)
math¶
mimetypes¶
新增
guess_file_type()
函式,用於從檔案系統路徑猜測 MIME 型別。現在使用guess_type()
的路徑 軟棄用。(由 Serhiy Storchaka 在 gh-66543 中貢獻。)
mmap¶
mmap
現在受到保護,防止在 Windows 上由於檔案系統錯誤或訪問衝突導致對映記憶體不可訪問時崩潰。(由 Jannis Weigend 在 gh-118209 中貢獻。)mmap
有一個新的seekable()
方法,當需要可查詢的檔案類物件時可以使用它。seek()
方法現在返回新的絕對位置。(由 Donghee Na 和 Sylvie Liberman 在 gh-111835 中貢獻。)mmap
新增的僅限 UNIX 的 trackfd 引數控制檔案描述符複製;如果為 false,則 fileno 指定的檔案描述符將不被複制。(由 Zackery Spytz 和 Petr Viktorin 在 gh-78502 中貢獻。)
multiprocessing¶
現在使用
os.process_cpu_count()
而不是os.cpu_count()
選擇預設的 worker 執行緒和程序數。(由 Victor Stinner 在 gh-109649 中貢獻。)
os¶
新增
process_cpu_count()
函式,用於獲取當前程序的呼叫執行緒可用的邏輯 CPU 核心數。(由 Victor Stinner 在 gh-109649 中貢獻。)cpu_count()
和process_cpu_count()
可以透過新的環境變數PYTHON_CPU_COUNT
或新的命令列選項-X cpu_count
覆蓋。此選項對於需要限制容器系統 CPU 資源而無需修改應用程式程式碼或容器本身的使用者非常有用。(由 Donghee Na 在 gh-109595 中貢獻。)透過
timerfd_create()
、timerfd_settime()
、timerfd_settime_ns()
、timerfd_gettime()
、timerfd_gettime_ns()
、TFD_NONBLOCK
、TFD_CLOEXEC
、TFD_TIMER_ABSTIME
和TFD_TIMER_CANCEL_ON_SET
添加了 Linux 定時器檔案描述符 的 低階介面。(由 Masaru Tsuchiyama 在 gh-108277 中貢獻。)lchmod()
和chmod()
的 follow_symlinks 引數現在都可在 Windows 上使用。請注意,在 Windows 上,lchmod()
中 follow_symlinks 的預設值為False
。(由 Serhiy Storchaka 在 gh-59616 中貢獻。)fchmod()
和chmod()
中對檔案描述符的支援現在都可在 Windows 上使用。(由 Serhiy Storchaka 在 gh-113191 中貢獻。)在 Windows 上,
mkdir()
和makedirs()
現在支援傳遞0o700
的 mode 值以對新目錄應用訪問控制。這隱式影響tempfile.mkdtemp()
,並且是 CVE 2024-4030 的緩解措施。mode 的其他值將繼續被忽略。(由 Steve Dower 在 gh-118486 中貢獻。)posix_spawn()
現在接受 env 引數為None
,這將使新生成程序使用當前程序環境。(由 Jakub Kulik 在 gh-113119 中貢獻。)posix_spawn()
現在可以在支援posix_spawn_file_actions_addclosefrom_np()
的平臺上,在 file_actions 引數中使用POSIX_SPAWN_CLOSEFROM
屬性。(由 Jakub Kulik 在 gh-113117 中貢獻。)
os.path¶
新增
isreserved()
以檢查路徑是否在當前系統上保留。此函式僅在 Windows 上可用。(由 Barney Gale 在 gh-88569 中貢獻。)在 Windows 上,
isabs()
不再將以恰好一個斜槓(\
或/
)開頭的路徑視為絕對路徑。(由 Barney Gale 和 Jon Foster 在 gh-44626 中貢獻。)realpath()
現在即使檔案不可訪問,也會解析 MS-DOS 風格的檔名。(由 Moonsik Park 在 gh-82367 中貢獻。)
pathlib¶
新增
UnsupportedOperation
,當路徑操作不支援時,它將代替NotImplementedError
引發。(由 Barney Gale 在 gh-89812 中貢獻。)新增一個用於從“file”URI (
file:///
) 建立Path
物件的新建構函式Path.from_uri()
。(由 Barney Gale 在 gh-107465 中貢獻。)新增
PurePath.full_match()
,用於使用 shell 風格萬用字元匹配路徑,包括遞迴萬用字元“**
”。(由 Barney Gale 在 gh-73435 中貢獻。)新增
PurePath.parser
類屬性,用於儲存用於低階路徑解析和連線的os.path
實現。這將是posixpath
或ntpath
。向
Path.glob()
和rglob()
新增 recurse_symlinks 僅限關鍵字引數。(由 Barney Gale 在 gh-77609 中貢獻。)Path.glob()
和rglob()
現在當給定以“**
”結尾的模式時,返回檔案和目錄。以前,只返回目錄。(由 Barney Gale 在 gh-70303 中貢獻。)向
Path.is_file
、Path.is_dir
、Path.owner()
和Path.group()
新增 follow_symlinks 僅限關鍵字引數。(由 Barney Gale 在 gh-105793 和 Kamil Turek 在 gh-107962 中貢獻。)
pdb¶
breakpoint()
和set_trace()
現在立即進入偵錯程式,而不是在下一行程式碼執行時。此更改可防止偵錯程式在breakpoint()
位於上下文末尾時跳出上下文。(由 Tian Gao 在 gh-118579 中貢獻。)當
sys.flags.safe_path
設定時,sys.path[0]
不再被除錯指令碼的目錄替換。(由 Tian Gao 和 Christian Walther 在 gh-111762 中貢獻。)在
pm()
中,透過新的 Pdb 命令exceptions [exc_number]
,增加了在事後除錯期間在鏈式異常之間移動的功能。(由 Matthias Bussonnier 在 gh-106676 中貢獻。)字首為 pdb 命令的表示式和語句現在可以正確識別和執行。(由 Tian Gao 在 gh-108464 中貢獻。)
queue¶
新增
Queue.shutdown
和ShutDown
來管理佇列終止。(由 Laurie Opperman 和 Yves Duprat 在 gh-104750 中貢獻。)
random¶
re¶
為了提高畫質晰度,將
re.error
重新命名為PatternError
。re.error
保留以實現向後相容性。
shutil¶
site¶
sqlite3¶
如果
Connection
物件未顯式closed
,則現在會發出ResourceWarning
。(由 Erlend E. Aasland 在 gh-105539 中貢獻。)向
Connection.iterdump()
新增 filter 僅限關鍵字引數,用於過濾要轉儲的資料庫物件。(由 Mariusz Felisiak 在 gh-91602 中貢獻。)
ssl¶
create_default_context()
API 現在在其預設標誌中包含VERIFY_X509_PARTIAL_CHAIN
和VERIFY_X509_STRICT
。備註
VERIFY_X509_STRICT
可能會拒絕 OpenSSL 底層實現原本可能接受的 pre-RFC 5280 或格式錯誤的證書。雖然不建議停用此功能,但您可以使用以下方法實現:import ssl ctx = ssl.create_default_context() ctx.verify_flags &= ~ssl.VERIFY_X509_STRICT
(由 William Woodruff 在 gh-112389 中貢獻。)
statistics¶
新增
kde()
用於核密度估計。這使得可以從固定數量的離散樣本估計連續機率密度函式。(由 Raymond Hettinger 在 gh-115863 中貢獻。)新增
kde_random()
用於從kde()
建立的估計機率密度函式進行取樣。(由 Raymond Hettinger 在 gh-115863 中貢獻。)
subprocess¶
subprocess
模組現在在更多情況下使用posix_spawn()
函式。值得注意的是,當 close_fds 為
True
(預設值)時,如果 C 庫提供posix_spawn_file_actions_addclosefrom_np()
,將使用posix_spawn()
,這包括最新版本的 Linux、FreeBSD 和 Solaris。在 Linux 上,這應該與現有的基於 Linuxvfork()
的程式碼效能相似。如果需要強制
subprocess
從不使用posix_spawn()
,可以將私有控制旋鈕subprocess._USE_POSIX_SPAWN
設定為False
。如果您設定了此值,請在 問題跟蹤器 中報告您的原因和平臺詳細資訊,以便我們為所有人改進 API 選擇邏輯。(由 Jakub Kulik 在 gh-113117 中貢獻。)
sys¶
新增
_is_interned()
函式,用於測試字串是否已被 intern。此函式不保證存在於所有 Python 實現中。(由 Serhiy Storchaka 在 gh-78573 中貢獻。)
tempfile¶
在 Windows 上,由於
os.mkdir()
的更改,tempfile.mkdtemp()
使用的預設模式0o700
現在限制對新目錄的訪問。這是 CVE 2024-4030 的緩解措施。(由 Steve Dower 在 gh-118486 中貢獻。)
時間¶
在 Windows 上,
monotonic()
現在使用QueryPerformanceCounter()
時鐘,解析度為 1 微秒,而不是解析度為 15.6 毫秒的GetTickCount64()
時鐘。(由 Victor Stinner 在 gh-88494 中貢獻。)在 Windows 上,
time()
現在使用GetSystemTimePreciseAsFileTime()
時鐘,解析度為 1 微秒,而不是解析度為 15.6 毫秒的GetSystemTimeAsFileTime()
時鐘。(由 Victor Stinner 在 gh-63207 中貢獻。)
tkinter¶
新增
tkinter
小部件方法:tk_busy_hold()
、tk_busy_configure()
、tk_busy_cget()
、tk_busy_forget()
、tk_busy_current()
和tk_busy_status()
。(由 Miguel、klappnase 和 Serhiy Storchaka 在 gh-72684 中貢獻。)tkinter
小部件方法wm_attributes()
現在接受不帶減號字首的屬性名稱以獲取視窗屬性,例如w.wm_attributes('alpha')
,並允許將屬性和要設定的值指定為關鍵字引數,例如w.wm_attributes(alpha=0.5)
。(由 Serhiy Storchaka 在 gh-43457 中貢獻。)wm_attributes()
現在可以透過使用新的可選關鍵字引數 return_python_dict 將屬性作為dict
返回。(由 Serhiy Storchaka 在 gh-43457 中貢獻。)當使用新的可選關鍵字引數 return_ints 時,
Text.count()
現在可以返回一個簡單的int
。否則,單個計數將作為 1 元組或None
返回。(由 Serhiy Storchaka 在 gh-97928 中貢獻。)在
tkinter.ttk.Style
的element_create()
方法中支援“vsapi”元素型別。(由 Serhiy Storchaka 在 gh-68166 中貢獻。)為 Tkinter 小部件新增
after_info()
方法。(由 Cheryl Sabella 在 gh-77020 中貢獻。)向
PhotoImage
添加了一個新的copy_replace()
方法,用於將一個影像的區域複製到另一個影像,可能帶有畫素縮放、二次取樣或兩者兼有。(由 Serhiy Storchaka 在 gh-118225 中貢獻。)向
PhotoImage
方法copy()
、zoom()
和subsample()
新增 from_coords 引數。向PhotoImage
方法copy()
新增 zoom 和 subsample 引數。(由 Serhiy Storchaka 在 gh-118225 中貢獻。)新增
PhotoImage
方法read()
以從檔案讀取影像,以及data()
以獲取影像資料。向write()
方法新增 background 和 grayscale 引數。(由 Serhiy Storchaka 在 gh-118271 中貢獻。)
traceback¶
向
TracebackException
新增exc_type_str
屬性,它包含 exc_type 的字串顯示。棄用exc_type
屬性,它包含型別物件本身。新增引數 save_exc_type(預設True
)以指示是否應儲存exc_type
。(由 Irit Katriel 在 gh-112332 中貢獻。)向
TracebackException.format_exception_only()
新增一個新的 show_group 僅限關鍵字引數,用於(遞迴地)格式化BaseExceptionGroup
例項的巢狀異常。(由 Irit Katriel 在 gh-105292 中貢獻。)
types¶
SimpleNamespace
現在可以接受單個位置引數來初始化名稱空間的引數。此引數必須是對映或鍵值對的可迭代物件。(由 Serhiy Storchaka 在 gh-108191 中貢獻。)
typing¶
新增
NoDefault
,一個哨兵物件,用於表示typing
模組中某些引數的預設值。(由 Jelle Zijlstra 在 gh-116126 中貢獻。)新增
get_protocol_members()
以返回定義typing.Protocol
的成員集。(由 Jelle Zijlstra 在 gh-104873 中貢獻。)新增
is_protocol()
以檢查類是否是Protocol
。(由 Jelle Zijlstra 在 gh-104873 中貢獻。)ClassVar
現在可以巢狀在Final
中,反之亦然。(由 Mehdi Drissi 在 gh-89547 中貢獻。)
unicodedata¶
venv¶
新增對在虛擬環境目錄中建立原始碼控制管理 (SCM) 忽略檔案的支援。預設情況下,支援 Git。這透過 API 作為可選功能實現,可以擴充套件以支援其他 SCM(
EnvBuilder
和create()
),並透過 CLI 使用--without-scm-ignore-files
作為可選退出功能。(由 Brett Cannon 在 gh-108125 中貢獻。)
warnings¶
PEP 702:新的
warnings.deprecated()
裝飾器提供了一種將棄用情況傳達給 靜態型別檢查器 的方法,並在使用棄用的類和函式時發出警告。在執行時使用裝飾函式或類時,也可能發出DeprecationWarning
。(由 Jelle Zijlstra 在 gh-104003 中貢獻。)
xml¶
允許控制 Expat >=2.6.0 重解析延遲(CVE 2023-52425),透過新增五個新方法:
xml.sax.expatreader.ExpatParser.flush()
(由 Sebastian Pipping 在 gh-115623 中貢獻。)
為
iterparse()
返回的迭代器新增close()
方法,用於顯式清理。(由 Serhiy Storchaka 在 gh-69893 中貢獻。)
zipimport¶
最佳化¶
幾個標準庫模組的匯入時間得到了顯著改善。例如,透過移除對
re
和contextlib
的依賴,typing
模組的匯入時間減少了大約三分之一。其他匯入時間得到加速的模組包括email.utils
、enum
、functools
、importlib.metadata
和threading
。(由 Alex Waygood、Shantanu Jain、Adam Turner、Daniel Hollas 等人在 gh-109653 中貢獻。)對於大型輸入,
textwrap.indent()
現在比以前快約 30%。(由 Inada Naoki 在 gh-107369 中貢獻。)subprocess
模組現在在更多情況下使用posix_spawn()
函式,包括在許多現代平臺上 close_fds 為True
(預設值)時。這應該會在 FreeBSD 和 Solaris 上啟動程序時提供顯著的效能提升。有關詳細資訊,請參閱上面的 subprocess 部分。(由 Jakub Kulik 在 gh-113117 中貢獻。)
已移除的模組和 API¶
PEP 594:從標準庫中移除“死電池”¶
PEP 594 提議從標準庫中移除 19 個模組,俗稱“死電池”,因為它們具有歷史性、過時或不安全的地位。以下所有模組在 Python 3.11 中已棄用,現在已被移除:
aifc
standard-aifc:使用 PyPI 中
aifc
庫的重新分發版本。
audioop
audioop-lts:使用 PyPI 中
audioop-lts
庫。
chunk
standard-chunk:使用 PyPI 中
chunk
庫的重新分發版本。
cgi
和cgitb
cgi.FieldStorage
通常可以替換為urllib.parse.parse_qsl()
用於GET
和HEAD
請求,以及email.message
模組或 multipart 庫用於POST
和PUT
請求。cgi.parse()
可以透過直接在所需的查詢字串上呼叫urllib.parse.parse_qs()
來替換,除非輸入是multipart/form-data
,這應該按照cgi.parse_multipart()
的描述進行替換。cgi.parse_header()
可以替換為email
包中的功能,它實現了相同的 MIME RFC。例如,使用email.message.EmailMessage
from email.message import EmailMessage msg = EmailMessage() msg['content-type'] = 'application/json; charset="utf8"' main, params = msg.get_content_type(), msg['content-type'].params
cgi.parse_multipart()
可以替換為email
包中的功能,它實現了相同的 MIME RFC,或者使用 multipart 庫。例如,email.message.EmailMessage
和email.message.Message
類。standard-cgi:和 standard-cgitb:使用 PyPI 中
cgi
和cgitb
庫的重新分發版本。
crypt
和私有_crypt
擴充套件。當只需要對值進行雜湊時,hashlib
模組可能是合適的替代品。否則,PyPI 上有各種第三方庫可用:bcrypt:適用於您的軟體和伺服器的現代密碼雜湊。
argon2-cffi:安全的 Argon2 密碼雜湊演算法。
legacycrypt:
ctypes
包裝器,用於 POSIX crypt 庫呼叫和相關功能。crypt_r:
crypt
模組的分支,包裝器,用於 crypt_r(3) 庫呼叫和相關功能。standard-crypt 和 deprecated-crypt-alternative:使用 PyPI 中
crypt
庫的重新分發版本和_crypt
庫的重新實現。
imghdr
:應使用 filetype、puremagic 或 python-magic 庫作為替代品。例如,puremagic.what()
函式可用於替換imghdr.what()
函式,適用於imghdr
支援的所有檔案格式。standard-imghdr:使用 PyPI 中
imghdr
庫的重新分發版本。
mailcap
:請改用mimetypes
模組。standard-mailcap:使用 PyPI 中
mailcap
庫的重新分發版本。
msilib
nis
nntplib
:請改用 PyPI 中的 pynntp 庫。standard-nntplib:使用 PyPI 中
nntplib
庫的重新分發版本。
ossaudiodev
:對於音訊播放,請改用 PyPI 中的 pygame 庫。pipes
:請改用subprocess
模組。使用shlex.quote()
替換未文件化的pipes.quote
函式。standard-pipes:使用 PyPI 中
pipes
庫的重新分發版本。
sndhdr
:應使用 filetype、puremagic 或 python-magic 庫作為替代品。standard-sndhdr:使用 PyPI 中
sndhdr
庫的重新分發版本。
spwd
:請改用 PyPI 中的 python-pam 庫。sunau
standard-sunau:使用 PyPI 中
sunau
庫的重新分發版本。
telnetlib
:請改用 PyPI 中的 telnetlib3 或 Exscript 庫。standard-telnetlib:使用 PyPI 中
telnetlib
庫的重新分發版本。
uu
:請改用base64
模組作為現代替代方案。standard-uu:使用 PyPI 中
uu
庫的重新分發版本。
xdrlib
standard-xdrlib:使用 PyPI 中
xdrlib
庫的重新分發版本。
(由 Victor Stinner 和 Zachary Ware 在 gh-104773 和 gh-104780 中貢獻。)
2to3¶
移除 2to3 程式和
lib2to3
模組,此前已在 Python 3.11 中棄用。(由 Victor Stinner 在 gh-104780 中貢獻。)
builtins¶
移除對鏈式
classmethod
描述符的支援(在 gh-63272 中引入)。這些描述符不能再用於包裝其他描述符,例如property
。此功能的核心設計存在缺陷並導致了幾個問題。要“穿透”一個classmethod
,請考慮使用 Python 3.10 中新增的__wrapped__
屬性。(由 Raymond Hettinger 在 gh-89519 中貢獻。)當在掛起的幀上呼叫
frame.clear()
時,會引發RuntimeError
(執行中的幀始終如此)。(由 Irit Katriel 在 gh-79932 中貢獻。)
configparser¶
移除未文件化的
LegacyInterpolation
類,該類自 Python 3.2 起在文件字串中棄用,自 Python 3.11 起在執行時棄用。(由 Hugo van Kemenade 在 gh-104886 中貢獻。)
importlib.metadata¶
移除對 EntryPoint 物件的已棄用的下標(
__getitem__()
)訪問。(由 Jason R. Coombs 在 gh-113175 中貢獻。)
locale¶
移除
locale.resetlocale()
函式,該函式在 Python 3.11 中已棄用。請改用locale.setlocale(locale.LC_ALL, "")
。(由 Victor Stinner 在 gh-104783 中貢獻。)
opcode¶
optparse¶
pathlib¶
re¶
移除了未文件化、已棄用且損壞的
re.template()
函式和re.TEMPLATE
/re.T
標誌。(由 Serhiy Storchaka 和 Nikita Sobolev 在 gh-105687 中貢獻。)
tkinter.tix¶
移除了
tkinter.tix
模組,該模組在 Python 3.6 中已棄用。該模組封裝的第三方 Tix 庫已不再維護。(由 Zachary Ware 在 gh-75552 中貢獻。)
turtle¶
移除了
RawTurtle.settiltangle()
方法,該方法自 Python 3.1 起在文件中棄用,自 Python 3.11 起在執行時棄用。(由 Hugo van Kemenade 在 gh-104876 中貢獻。)
typing¶
unittest¶
移除了以下
unittest
函式,這些函式在 Python 3.11 中已棄用unittest.findTestCases()
unittest.makeSuite()
unittest.getTestCaseNames()
請改用
TestLoader
方法(由 Hugo van Kemenade 在 gh-104835 中貢獻。)
移除了未經測試且未文件化的
TestProgram.usageExit()
方法,該方法在 Python 3.11 中已棄用。(由 Hugo van Kemenade 在 gh-104992 中貢獻。)
urllib¶
移除了
urllib.request.urlopen()
函式的 cafile、capath 和 cadefault 引數,這些引數在 Python 3.6 中已棄用。請改用帶有SSLContext
例項的 context 引數。ssl.SSLContext.load_cert_chain()
函式可用於載入特定證書,或者讓ssl.create_default_context()
選擇作業系統的受信任證書頒發機構 (CA) 證書。(由 Victor Stinner 在 gh-105382 中貢獻。)
webbrowser¶
移除了未經測試且未文件化的
MacOSX
類,該類在 Python 3.11 中已棄用。請改用MacOSXOSAScript
類(在 Python 3.2 中引入)。(由 Hugo van Kemenade 在 gh-104804 中貢獻。)移除了已棄用的
MacOSXOSAScript._name
屬性。請改用MacOSXOSAScript.name
屬性。(由 Nikita Sobolev 在 gh-105546 中貢獻。)
新棄用¶
dis
:-
棄用在
gettext
模組中,即使未找到翻譯,將非整數數字作為考慮複數形式的函式和方法的引數的做法。(由 Serhiy Storchaka 在 gh-88434 中貢獻。)
glob
:棄用未文件化的
glob0()
和glob1()
函式。請改用glob()
並向 root_dir 引數傳遞指定根目錄的 類路徑物件。(由 Barney Gale 在 gh-117337 中貢獻。)
-
棄用
CGIHTTPRequestHandler
,該類將在 Python 3.15 中移除。基於程序的 CGI HTTP 伺服器已經失寵很長時間了。此程式碼已過時、未維護且很少使用。它具有很高的安全性和功能錯誤潛力。(由 Gregory P. Smith 在 gh-109096 中貢獻。)棄用 python -m http.server 命令列介面的
--cgi
標誌,該標誌將在 Python 3.15 中移除。(由 Gregory P. Smith 在 gh-109096 中貢獻。)
-
軟棄用 傳遞檔案路徑引數給
guess_type()
,請改用guess_file_type()
。(由 Serhiy Storchaka 在 gh-66543 中貢獻。)
re
:-
棄用
PurePath.is_reserved()
,該方法將在 Python 3.15 中移除。請使用os.path.isreserved()
在 Windows 上檢測保留路徑。(由 Barney Gale 在 gh-88569 中貢獻。)
-
棄用
java_ver()
,該函式將在 Python 3.15 中移除。此函式僅對 Jython 支援有用,API 令人困惑,且大部分未經測試。(由 Nikita Sobolev 在 gh-116349 中貢獻。)
-
棄用未文件化的
ispackage()
函式。(由 Zackery Spytz 在 gh-64020 中貢獻。)
-
棄用向
connect()
函式和Connection
建構函式傳遞多個位置引數的做法。其餘引數將在 Python 3.15 中變為僅限關鍵字。(由 Erlend E. Aasland 在 gh-107948 中貢獻。)棄用將名稱、引數數量和可呼叫物件作為關鍵字引數傳遞給
Connection.create_function()
和Connection.create_aggregate()
的做法。這些引數將在 Python 3.15 中變為僅限位置。(由 Erlend E. Aasland 在 gh-108278 中貢獻。)棄用將回調可呼叫物件作為關鍵字傳遞給
set_authorizer()
、set_progress_handler()
和set_trace_callback()
Connection
方法的做法。回撥可呼叫物件將在 Python 3.15 中變為僅限位置。(由 Erlend E. Aasland 在 gh-108278 中貢獻。)
sys
:棄用
_enablelegacywindowsfsencoding()
函式,該函式將在 Python 3.16 中移除。請改用PYTHONLEGACYWINDOWSFSENCODING
環境變數。(由 Inada Naoki 在 gh-73427 中貢獻。)
-
棄用未文件化且未使用的
TarFile.tarfile
屬性,該屬性將在 Python 3.16 中移除。(在 gh-115256 中貢獻。)
-
棄用
TracebackException.exc_type
屬性。請改用TracebackException.exc_type_str
。(由 Irit Katriel 在 gh-112332 中貢獻。)
-
棄用建立
NamedTuple
類的未文件化關鍵字引數語法(例如Point = NamedTuple("Point", x=int, y=int)
),該語法將在 Python 3.15 中移除。請改用基於類的語法或函式式語法。(由 Alex Waygood 在 gh-105566 中貢獻。)棄用建立
NamedTuple
或typing.TypedDict
類時省略 fields 引數,並棄用向這兩種型別的 fields 引數傳遞None
。Python 3.15 將要求 fields 引數為有效的序列。要建立零欄位的 NamedTuple 類,請使用class NT(NamedTuple): pass
或NT = NamedTuple("NT", ())
。要建立零欄位的 TypedDict 類,請使用class TD(TypedDict): pass
或TD = TypedDict("TD", {})
。(由 Alex Waygood 在 gh-105566 和 gh-105570 中貢獻。)棄用
typing.no_type_check_decorator()
裝飾器函式,該函式將在 Python 3.15 中移除。在typing
模組中存在八年之後,它尚未得到任何主要型別檢查器的支援。(由 Alex Waygood 在 gh-106309 中貢獻。)棄用
typing.AnyStr
。在 Python 3.16 中,它將從typing.__all__
中移除,並在匯入或訪問時在執行時發出DeprecationWarning
。它將在 Python 3.18 中完全移除。請改用新的 型別引數語法。(由 Michael The 在 gh-107116 中貢獻。)
wave
:棄用
Wave_read
和Wave_write
類的getmark()
、setmark()
和getmarkers()
方法,這些方法將在 Python 3.15 中移除。(由 Victor Stinner 在 gh-105096 中貢獻。)
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 中貢獻。)-
子程序觀察器類
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.ResourceReader
importlib.abc.Traversable
importlib.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
:訪問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 起棄用。請改用基於類的語法或函式式語法。當使用
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.SelectorEventLoop
import 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_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
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()
。
CPython 位元組碼更改¶
如果 yield 是 yield-from 或 await 的一部分,則
YIELD_VALUE
的操作碼現為1
,否則為0
。RESUME
的操作碼已更改,添加了一個位,指示 except-depth 是否為 1,這對於最佳化生成器的關閉是必需的。(由 Irit Katriel 在 gh-111354 中貢獻。)
C API 更改¶
新功能¶
新增 PyMonitoring C API 用於生成 PEP 669 監控事件
PyMonitoring_FireBranchEvent
(由 Irit Katriel 在 gh-111997 中貢獻)。
新增
PyMutex
,一個佔用單個位元組的輕量級互斥鎖,以及新的PyMutex_Lock()
和PyMutex_Unlock()
函式。PyMutex_Lock()
如果操作需要阻塞,將釋放 GIL(如果當前持有)。(由 Sam Gross 在 gh-108724 中貢獻。)新增 PyTime C API 以提供對系統時鐘的訪問
(由 Victor Stinner 和 Petr Viktorin 在 gh-110850 中貢獻。)
新增
PyDict_ContainsString()
函式,其行為與PyDict_Contains()
相同,但 key 被指定為 const char* UTF-8 編碼的位元組字串,而不是 PyObject*。(由 Victor Stinner 在 gh-108314 中貢獻。)新增
PyDict_GetItemRef()
和PyDict_GetItemStringRef()
函式,它們的行為類似於PyDict_GetItemWithError()
,但返回 強引用 而不是 借用引用。此外,這些函式在出錯時返回-1
,從而無需檢查PyErr_Occurred()
。(由 Victor Stinner 在 gh-106004 中貢獻。)新增
PyDict_SetDefaultRef()
函式,其行為類似於PyDict_SetDefault()
,但返回 強引用 而不是 借用引用。此函式在出錯時返回-1
,在插入時返回0
,如果字典中已存在該鍵則返回1
。(由 Sam Gross 在 gh-112066 中貢獻。)新增
PyDict_Pop()
和PyDict_PopString()
函式,用於從字典中移除一個鍵並可選地返回被移除的值。這類似於 Python 的dict.pop()
,但沒有預設值,並且不會因缺少鍵而引發KeyError
。(由 Stefan Behnel 和 Victor Stinner 在 gh-111262 中貢獻。)新增
PyMapping_GetOptionalItem()
和PyMapping_GetOptionalItemString()
函式,作為PyObject_GetItem()
和PyMapping_GetItemString()
的替代品。新函式在對映中缺少請求的鍵時不會引發KeyError
。如果缺少鍵不應被視為失敗,這些變體更方便快捷。(由 Serhiy Storchaka 在 gh-106307 中貢獻。)新增
PyObject_GetOptionalAttr()
和PyObject_GetOptionalAttrString()
函式,作為PyObject_GetAttr()
和PyObject_GetAttrString()
的替代品。新函式在物件上未找到請求的屬性時不會引發AttributeError
。如果缺少屬性不應被視為失敗,這些變體更方便快捷。(由 Serhiy Storchaka 在 gh-106521 中貢獻。)新增
PyErr_FormatUnraisable()
函式,作為PyErr_WriteUnraisable()
的擴充套件,允許自定義警告訊息。(由 Serhiy Storchaka 在 gh-108082 中貢獻。)作為 PEP 667 的一部分,添加了返回幀區域性變數、全域性變數和內建函式的 強引用 而不是 借用引用 的新函式
(由 Mark Shannon 和 Tian Gao 在 gh-74929 中貢獻。)
新增
Py_GetConstant()
和Py_GetConstantBorrowed()
函式以獲取常量的 強引用 或 借用引用。例如,Py_GetConstant(Py_CONSTANT_ZERO)
返回常量零的強引用。(由 Victor Stinner 在 gh-115754 中貢獻。)新增
PyImport_AddModuleRef()
函式作為PyImport_AddModule()
的替代品,它返回 強引用 而不是 借用引用。(由 Victor Stinner 在 gh-105922 中貢獻。)新增
Py_IsFinalizing()
函式以檢查主 Python 直譯器是否正在 關閉。(由 Victor Stinner 在 gh-108014 中貢獻。)新增
PyList_GetItemRef()
函式作為PyList_GetItem()
的替代品,它返回 強引用 而不是 借用引用。(由 Sam Gross 在 gh-114329 中貢獻。)新增
PyList_Extend()
和PyList_Clear()
函式,它們映象了 Python 的list.extend()
和list.clear()
方法。(由 Victor Stinner 在 gh-111138 中貢獻。)新增
PyLong_AsInt()
函式。其行為類似於PyLong_AsLong()
,但將結果儲存在 C int 中,而不是 C long 中。(由 Victor Stinner 在 gh-108014 中貢獻。)新增
PyLong_AsNativeBytes()
、PyLong_FromNativeBytes()
和PyLong_FromUnsignedNativeBytes()
函式,以簡化本機整數型別和 Pythonint
物件之間的轉換。(由 Steve Dower 在 gh-111140 中貢獻。)新增
PyModule_Add()
函式,它類似於PyModule_AddObjectRef()
和PyModule_AddObject()
,但始終竊取對值的引用。(由 Serhiy Storchaka 在 gh-86493 中貢獻。)新增
PyObject_GenericHash()
函式,該函式實現 Python 物件的預設雜湊函式。(由 Serhiy Storchaka 在 gh-113024 中貢獻。)新增
Py_HashPointer()
函式以雜湊原始指標。(由 Victor Stinner 在 gh-111545 中貢獻。)新增
PyObject_VisitManagedDict()
和PyObject_ClearManagedDict()
函式,這些函式必須由使用Py_TPFLAGS_MANAGED_DICT
標誌的型別的遍歷和清除函式呼叫。pythoncapi-compat 專案 可用於在 Python 3.11 和 3.12 中使用這些函式。(由 Victor Stinner 在 gh-107073 中貢獻。)新增
PyRefTracer_SetTracer()
和PyRefTracer_GetTracer()
函式,它們可以像tracemalloc
模組一樣跟蹤物件的建立和銷燬。(由 Pablo Galindo 在 gh-93502 中貢獻。)新增
PySys_AuditTuple()
函式作為PySys_Audit()
的替代品,它將事件引數作為 Pythontuple
物件。(由 Victor Stinner 在 gh-85283 中貢獻。)新增
PyThreadState_GetUnchecked()
函式作為PyThreadState_Get()
的替代品,如果結果為NULL
,它不會以致命錯誤殺死程序。呼叫者負責檢查結果是否為NULL
。(由 Victor Stinner 在 gh-108867 中貢獻。)新增
PyType_GetFullyQualifiedName()
函式以獲取型別的完全限定名。如果type.__module__
是字串且不等於'builtins'
或'__main__'
,則會新增模組名。(由 Victor Stinner 在 gh-111696 中貢獻。)新增
PyType_GetModuleName()
函式以獲取型別的模組名。這等同於獲取type.__module__
屬性。(由 Eric Snow 和 Victor Stinner 在 gh-111696 中貢獻。)新增
PyUnicode_EqualToUTF8AndSize()
和PyUnicode_EqualToUTF8()
函式,用於將 Unicode 物件與 const char* UTF-8 編碼字串進行比較,如果它們相等則返回1
,否則返回0
。這些函式不引發異常。(由 Serhiy Storchaka 在 gh-110289 中貢獻。)新增
PyWeakref_GetRef()
函式作為PyWeakref_GetObject()
的替代品,它返回 強引用,如果被引用物件不再存在則返回NULL
。(由 Victor Stinner 在 gh-105927 中貢獻。)新增靜默忽略錯誤的函式的修正版本
PyObject_HasAttrStringWithError()
替換PyObject_HasAttrString()
。PyMapping_HasKeyStringWithError()
替換了PyMapping_HasKeyString()
。
新的函式在發生錯誤時返回
-1
,在結果為真時返回標準的1
,在結果為假時返回0
。(由 Serhiy Storchaka 在 gh-108511 中貢獻。)
已更改的 C API¶
PyArg_ParseTupleAndKeywords()
和PyArg_VaParseTupleAndKeywords()
的 keywords 引數現在在 C 中型別為 char *const*,在 C++ 中型別為 const char *const*,而不是 char**。在 C++ 中,這使得這些函式與型別為 const char *const*、const char** 或 char *const* 的引數相容,無需顯式型別轉換。在 C 中,這些函式僅支援型別為 char *const* 的引數。這可以透過PY_CXX_CONST
宏覆蓋。(由 Serhiy Storchaka 在 gh-65210 中貢獻。)PyArg_ParseTupleAndKeywords()
現在支援非 ASCII 關鍵字引數名稱。(由 Serhiy Storchaka 在 gh-110815 中貢獻。)PyCode_GetFirstFree()
函式現在是不穩定 API,並被命名為PyUnstable_Code_GetFirstFree()
。(由 Bogdan Romanyuk 在 gh-115781 中貢獻。)函式
PyDict_GetItem()
、PyDict_GetItemString()
、PyMapping_HasKey()
、PyMapping_HasKeyString()
、PyObject_HasAttr()
、PyObject_HasAttrString()
和PySys_GetObject()
在呼叫時會清除所有發生的錯誤,現在它們使用sys.unraisablehook()
報告這些錯誤。您可以根據文件中的建議將其替換為其他函式。(由 Serhiy Storchaka 在 gh-106672 中貢獻。)為
PyUnicode_FromFormat()
添加了對%T
、%#T
、%N
和%#N
格式的支援%T
: 獲取物件型別的完整限定名%#T
: 同上,但使用冒號作為分隔符%N
: 獲取型別的完整限定名%#N
: 同上,但使用冒號作為分隔符
在使用 格式程式碼 中的
#
格式時,您不再需要在包含Python.h
之前定義PY_SSIZE_T_CLEAN
宏。接受格式程式碼的 API 始終對#
格式使用Py_ssize_t
。(由 Inada Naoki 在 gh-104922 中貢獻。)如果 Python 以 除錯模式 構建或
with assertions
構建,PyTuple_SET_ITEM()
和PyList_SET_ITEM()
現在會使用斷言檢查索引引數。(由 Victor Stinner 在 gh-106168 中貢獻。)
受限 C API 更改¶
以下函式現在已包含在受限 C API 中
使用
--with-trace-refs
(追蹤引用) 構建的 Python 現在支援 受限 API。(由 Victor Stinner 在 gh-108634 中貢獻。)
已移除的 C API¶
移除了一些以
_Py
或_PY
為字首的函式、宏、變數等 (被認為是私有的)。如果您的專案受到其中某個移除的影響,並且您認為移除的 API 應該仍然可用,請 提出新問題 以請求公開 C API,並在問題中新增cc: @vstinner
以通知 Victor Stinner。(由 Victor Stinner 在 gh-106320 中貢獻。)刪除了 Python 3.0 中已棄用的舊緩衝區協議。請改用 緩衝區協議。
PyObject_CheckReadBuffer()
:使用PyObject_CheckBuffer()
來測試物件是否支援緩衝區協議。請注意,PyObject_CheckBuffer()
不保證PyObject_GetBuffer()
會成功。要測試物件是否實際可讀,請參見PyObject_GetBuffer()
的下一個示例。PyObject_AsCharBuffer()
,PyObject_AsReadBuffer()
: 請改用PyObject_GetBuffer()
和PyBuffer_Release()
Py_buffer view; if (PyObject_GetBuffer(obj, &view, PyBUF_SIMPLE) < 0) { return NULL; } // Use `view.buf` and `view.len` to read from the buffer. // You may need to cast buf as `(const char*)view.buf`. PyBuffer_Release(&view);
PyObject_AsWriteBuffer()
: 請改用PyObject_GetBuffer()
和PyBuffer_Release()
Py_buffer view; if (PyObject_GetBuffer(obj, &view, PyBUF_WRITABLE) < 0) { return NULL; } // Use `view.buf` and `view.len` to write to the buffer. PyBuffer_Release(&view);
(由 Inada Naoki 在 gh-85275 中貢獻。)
移除 Python 3.9 中已棄用的各種函式
PyEval_CallObject()
、PyEval_CallObjectWithKeywords()
:請改用PyObject_CallNoArgs()
或PyObject_Call()
。警告
在
PyObject_Call()
中,位置引數必須是tuple
且不能為NULL
,而關鍵字引數必須是dict
或NULL
。被移除的函式會檢查引數型別,並接受NULL
位置和關鍵字引數。要將PyEval_CallObjectWithKeywords(func, NULL, kwargs)
替換為PyObject_Call()
,請使用PyTuple_New(0)
傳遞空元組作為位置引數。PyEval_CallFunction()
: 請改用PyObject_CallFunction()
。PyEval_CallMethod()
: 請改用PyObject_CallMethod()
。PyCFunction_Call()
: 請改用PyObject_Call()
。
(由 Victor Stinner 在 gh-105107 中貢獻。)
移除 Python 3.11 中已棄用的以下用於配置 Python 初始化的舊函式
PySys_AddWarnOptionUnicode()
:請改用PyConfig.warnoptions
。PySys_AddWarnOption()
:請改用PyConfig.warnoptions
。PySys_AddXOption()
:請改用PyConfig.xoptions
。PySys_HasWarnOptions()
:請改用PyConfig.xoptions
。PySys_SetPath()
:請改設PyConfig.module_search_paths
。Py_SetPath()
:請改設PyConfig.module_search_paths
。Py_SetStandardStreamEncoding()
:請改設PyConfig.stdio_encoding
,並可能設定PyConfig.legacy_windows_stdio
(在 Windows 上)。_Py_SetProgramFullPath()
:請改設PyConfig.executable
。
請改用 Python 3.8 中新增的
PyConfig
API 的 Python 初始化配置 (PEP 587)。(由 Victor Stinner 在 gh-105145 中貢獻。)移除 Python 3.2 中已棄用的
PyEval_AcquireLock()
和PyEval_ReleaseLock()
函式。它們沒有更新當前執行緒狀態。它們可以被替換為(由 Victor Stinner 在 gh-105182 中貢獻。)
移除 Python 3.9 中已棄用的
PyEval_ThreadsInitialized()
函式。自 Python 3.7 以來,Py_Initialize()
始終建立 GIL:呼叫PyEval_InitThreads()
不執行任何操作,PyEval_ThreadsInitialized()
始終返回非零值。(由 Victor Stinner 在 gh-105182 中貢獻。)移除了
_PyInterpreterState_Get()
,它是PyInterpreterState_Get()
的別名,用於向後相容 Python 3.8。pythoncapi-compat 專案 可用於在 Python 3.8 及更早版本中獲取PyInterpreterState_Get()
。(由 Victor Stinner 在 gh-106320 中貢獻。)移除了私有函式
_PyObject_FastCall()
:請改用自 Python 3.8 (PEP 590) 起可用的PyObject_Vectorcall()
。(由 Victor Stinner 在 gh-106023 中貢獻。)移除
cpython/pytime.h
標頭檔案,該檔案只包含私有函式。(由 Victor Stinner 在 gh-106316 中貢獻。)從受限 C API 中移除了未文件化的
PY_TIMEOUT_MAX
常量。(由 Victor Stinner 在 gh-110014 中貢獻。)移除了舊的垃圾回收宏
Py_TRASHCAN_SAFE_BEGIN
和Py_TRASHCAN_SAFE_END
。請改用新的宏Py_TRASHCAN_BEGIN
和Py_TRASHCAN_END
。(由 Irit Katriel 在 gh-105111 中貢獻。)
已棄用的 C API¶
棄用舊的 Python 初始化函式
PySys_ResetWarnOptions()
:請改用清空sys.warnoptions
和warnings.filters
。Py_GetPath()
:請改用sys.path
。Py_GetPrefix()
:請改用sys.prefix
。Py_GetPythonHome()
:請改用PyConfig.home
或PYTHONHOME
環境變數。
(由 Victor Stinner 在 gh-105145 中貢獻。)
軟棄用
PyEval_GetBuiltins()
、PyEval_GetGlobals()
和PyEval_GetLocals()
函式,它們返回 借用引用。(作為 PEP 667 的一部分軟棄用。)棄用
PyImport_ImportModuleNoBlock()
函式,該函式自 Python 3.3 起只是PyImport_ImportModule()
的別名。(由 Victor Stinner 在 gh-105396 中貢獻。)軟棄用
PyModule_AddObject()
函式。應將其替換為PyModule_Add()
或PyModule_AddObjectRef()
。(由 Serhiy Storchaka 在 gh-86493 中貢獻。)棄用舊的
Py_UNICODE
和PY_UNICODE_TYPE
型別以及Py_UNICODE_WIDE
定義。請直接使用wchar_t
型別。自 Python 3.3 以來,Py_UNICODE
和PY_UNICODE_TYPE
只是wchar_t
的別名。(由 Victor Stinner 在 gh-105156 中貢獻。)棄用
PyWeakref_GetObject()
和PyWeakref_GET_OBJECT()
函式,它們返回 借用引用。請將其替換為新的PyWeakref_GetRef()
函式,該函式返回 強引用。pythoncapi-compat 專案 可用於在 Python 3.12 及更早版本上獲取PyWeakref_GetRef()
。(由 Victor Stinner 在 gh-105927 中貢獻。)
Python 3.14 中即將移除¶
擴充套件模組的
PyDictObject
中的ma_version_tag
欄位 (PEP 699;gh-101193)。使用可變基類建立
immutable types
(gh-95388)。
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
副本。
計劃在 Python 3.18 中移除¶
以下私有函式已被棄用,並計劃在 Python 3.18 中移除
_PyBytes_Join()
:請使用PyBytes_Join()
。_PyDict_GetItemStringWithError()
:請使用PyDict_GetItemStringRef()
。_PyDict_Pop()
:請使用PyDict_Pop()
。_PyLong_Sign()
:請使用PyLong_GetSign()
。_PyLong_FromDigits()
和_PyLong_New()
:請使用PyLongWriter_Create()
。_PyThreadState_UncheckedGet()
:請使用PyThreadState_GetUnchecked()
。_PyUnicode_AsString()
:請使用PyUnicode_AsUTF8()
。_PyUnicodeWriter_Init()
:請將_PyUnicodeWriter_Init(&writer)
替換為writer = PyUnicodeWriter_Create(0)
。_PyUnicodeWriter_Finish()
:請將_PyUnicodeWriter_Finish(&writer)
替換為PyUnicodeWriter_Finish(writer)
。_PyUnicodeWriter_Dealloc()
:請將_PyUnicodeWriter_Dealloc(&writer)
替換為PyUnicodeWriter_Discard(writer)
。_PyUnicodeWriter_WriteChar()
:請將_PyUnicodeWriter_WriteChar(&writer, ch)
替換為PyUnicodeWriter_WriteChar(writer, ch)
。_PyUnicodeWriter_WriteStr()
:請將_PyUnicodeWriter_WriteStr(&writer, str)
替換為PyUnicodeWriter_WriteStr(writer, str)
。_PyUnicodeWriter_WriteSubstring()
:請將_PyUnicodeWriter_WriteSubstring(&writer, str, start, end)
替換為PyUnicodeWriter_WriteSubstring(writer, str, start, end)
。_PyUnicodeWriter_WriteASCIIString()
:請將_PyUnicodeWriter_WriteASCIIString(&writer, str)
替換為PyUnicodeWriter_WriteASCII(writer, str)
。_PyUnicodeWriter_WriteLatin1String()
:請將_PyUnicodeWriter_WriteLatin1String(&writer, str)
替換為PyUnicodeWriter_WriteUTF8(writer, str)
。_PyUnicodeWriter_Prepare()
:(無替代品)。_PyUnicodeWriter_PrepareKind()
:(無替代品)。_Py_HashPointer()
:請使用Py_HashPointer()
。_Py_fopen_obj()
:請使用Py_fopen()
。
可以使用 pythoncapi-compat 專案 在 Python 3.13 及更早版本中獲得這些新的公共函式。(由 Victor Stinner 在 gh-128863 中貢獻。)
未來版本中即將移除¶
以下 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
構建更改¶
arm64-apple-ios
和arm64-apple-ios-simulator
現在都是 PEP 11 第三層平臺。(Russell Keith-Magee 貢獻了 PEP 730 的編寫和實現,參見 gh-114099。)aarch64-linux-android
和x86_64-linux-android
現在都是 PEP 11 第三層平臺。(Malcolm Smith 貢獻了 PEP 738 的編寫和實現,參見 gh-116622。)wasm32-wasi
現在是 PEP 11 第二層平臺。(由 Brett Cannon 在 gh-115192 中貢獻。)wasm32-emscripten
不再是 PEP 11 支援的平臺。(由 Brett Cannon 在 gh-115192 中貢獻。)構建 CPython 現在需要一個支援 C11 原子庫、GCC 內建原子函式或 MSVC 互鎖內部函式的編譯器。
現在需要 Autoconf 2.71 和 aclocal 1.16.5 才能重新生成
configure
指令碼。(由 Christian Heimes 在 gh-89886 中貢獻,並由 Victor Stinner 在 gh-112090 中貢獻。)需要 SQLite 3.15.2 或更新版本才能構建
sqlite3
擴充套件模組。(由 Erlend Aasland 在 gh-105875 中貢獻。)CPython 現在預設捆綁 mimalloc 庫。它採用 MIT 許可證授權;詳見 mimalloc 許可證。捆綁的 mimalloc 進行了自定義修改,詳見 gh-113141。(由 Dino Viehland 在 gh-109914 中貢獻。)
configure
選項--with-system-libmpdec
現在預設為yes
。捆綁的libmpdec
將在 Python 3.16 中移除。使用
configure
--with-trace-refs
(跟蹤引用) 構建的 Python 現在與 Python 釋出版構建和 除錯構建 ABI 相容。(由 Victor Stinner 在 gh-108634 中貢獻。)在 POSIX 系統上,pkg-config (
.pc
) 檔名現在包含 ABI 標誌。例如,自由執行緒構建生成python-3.13t.pc
,除錯構建生成python-3.13d.pc
。errno
、fcntl
、grp
、md5
、pwd
、resource
、termios
、winsound
、_ctypes_test
、_multiprocessing.posixshmem
、_scproxy
、_stat
、_statistics
、_testconsole
、_testimportmultiple
和_uuid
C 擴充套件現在使用 受限 C API 構建。(由 Victor Stinner 在 gh-85283 中貢獻。)
移植到 Python 3.13¶
本節列出了前面描述過的變更以及其他可能需要修改程式碼的 bug 修復。
Python API 的變化¶
PEP 667 引入了
locals()
和f_locals
語義的幾項更改在 最佳化範圍 中呼叫
locals()
現在每次呼叫都會生成一個獨立的快照,因此不再隱式更新先前返回的引用。要獲得傳統的 CPython 行為,現在需要顯式呼叫以使用後續locals()
呼叫的結果更新最初返回的字典。隱式以locals()
為目標的程式碼執行函式(例如exec
和eval
)必須傳遞一個顯式名稱空間才能在最佳化範圍內訪問其結果。(作為 PEP 667 的一部分進行了更改。)在模組或類作用域的推導式中呼叫
locals()
(包括透過exec
或eval
) 再次表現為推導式作為獨立的巢狀函式執行 (即不包含包含作用域中的區域性變數)。在 Python 3.12 中,當實現 PEP 709 時,這已經更改為包含包含作用域中的區域性變數。(作為 PEP 667 的一部分進行了更改。)在 最佳化作用域 中訪問
FrameType.f_locals
現在返回一個直寫代理,而不是一個在未指定時間更新的快照。如果需要快照,必須使用dict
或代理的.copy()
方法顯式建立。(作為 PEP 667 的一部分進行了更改。)
functools.partial
在用作方法時現在會發出FutureWarning
。其行為將在未來的 Python 版本中改變。如果您想保留舊的行為,請將其包裝在staticmethod()
中。(由 Serhiy Storchaka 在 gh-121027 中貢獻。)getpass.getuser()
現在會在檢索使用者名稱失敗時引發OSError
>,而不是在非 Unix 平臺上引發ImportError
>,或在密碼資料庫為空的 Unix 平臺上引發KeyError
>。gzip.GzipFile
的mode
屬性的值現在是字串('rb'
或'wb'
),而不是整數(1
或2
)。zipfile.ZipFile.open()
返回的可讀檔案類物件的mode
屬性的值現在是'rb'
,而不是'r'
。(由 Serhiy Storchaka 在 gh-115961 中貢獻。)mailbox.Maildir
現在忽略以點 (.
) 開頭的檔案。(由 Zackery Spytz 在 gh-65559 中貢獻。)pathlib.Path.glob()
和rglob()
現在,如果給定的模式以“**
”結尾,則會同時返回檔案和目錄,而不是僅返回目錄。新增一個尾部斜槓以保持以前的行為並僅匹配目錄。threading
模組現在要求_thread
模組具有一個_is_main_interpreter()
函式。此函式不接受任何引數,如果當前直譯器是主直譯器,則返回True
。任何提供自定義
_thread
模組的庫或應用程式都必須提供_is_main_interpreter()
,就像該模組的其他“私有”屬性一樣。(gh-112826。)
C API 的變化¶
Python.h
不再包含<ieeefp.h>
標準標頭檔案。它曾用於提供finite()
函式,該函式現在由<math.h>
標頭檔案提供。如果需要,現在應顯式包含它。同時移除了HAVE_IEEEFP_H
宏。(由 Victor Stinner 在 gh-108765 中貢獻。)Python.h
不再包含以下標準標頭檔案:<time.h>
、<sys/select.h>
和<sys/time.h>
。如果需要,現在應該顯式包含它們。例如,<time.h>
提供clock()
和gmtime()
函式,<sys/select.h>
提供select()
函式,<sys/time.h>
提供futimes()
、gettimeofday()
和setitimer()
函式。(由 Victor Stinner 在 gh-108765 中貢獻。)在 Windows 上,
Python.h
不再包含<stddef.h>
標準標頭檔案。如果需要,現在應該顯式包含它。例如,它提供了offsetof()
函式以及size_t
和ptrdiff_t
型別。顯式包含<stddef.h>
已經被所有其他平臺所需要,HAVE_STDDEF_H
宏只在 Windows 上定義。(由 Victor Stinner 在 gh-108765 中貢獻。)如果定義了
Py_LIMITED_API
宏,則Py_BUILD_CORE
、Py_BUILD_CORE_BUILTIN
和Py_BUILD_CORE_MODULE
宏現在會被<Python.h>
取消定義。(由 Victor Stinner 在 gh-85283 中貢獻。)舊的垃圾回收宏
Py_TRASHCAN_SAFE_BEGIN
和Py_TRASHCAN_SAFE_END
已被移除。它們應該被新的宏Py_TRASHCAN_BEGIN
和Py_TRASHCAN_END
替換。使用舊宏的
tp_dealloc
函式,例如static void mytype_dealloc(mytype *p) { PyObject_GC_UnTrack(p); Py_TRASHCAN_SAFE_BEGIN(p); ... Py_TRASHCAN_SAFE_END }
應按如下方式遷移到新宏
static void mytype_dealloc(mytype *p) { PyObject_GC_UnTrack(p); Py_TRASHCAN_BEGIN(p, mytype_dealloc) ... Py_TRASHCAN_END }
請注意,
Py_TRASHCAN_BEGIN
有第二個引數,該引數應該是它所在的釋放函式。新宏在 Python 3.8 中新增,舊宏在 Python 3.11 中棄用。(由 Irit Katriel 在 gh-105111 中貢獻。)
PEP 667 引入了與幀相關的函式的幾項更改
在 最佳化作用域 中修改從
PyEval_GetLocals()
返回的字典的影響已更改。以這種方式新增的新字典條目現在將 僅 對該幀中後續的PyEval_GetLocals()
呼叫可見,因為PyFrame_GetLocals()
、locals()
和FrameType.f_locals
不再訪問相同的底層快取字典。對實際變數名和透過直寫代理介面新增的名稱的條目所做的更改將在該幀中後續呼叫PyEval_GetLocals()
時被覆蓋。建議的程式碼更新取決於函式的使用方式,因此請參閱函式的棄用通知以獲取詳細資訊。在 最佳化作用域 中呼叫
PyFrame_GetLocals()
現在返回一個直寫代理,而不是一個在未指定時間更新的快照。如果需要快照,必須顯式建立(例如使用PyDict_Copy()
),或者呼叫新的PyEval_GetFrameLocals()
API。PyFrame_FastToLocals()
和PyFrame_FastToLocalsWithError()
不再有任何效果。自 Python 3.11 引入PyFrame_GetLocals()
以來,呼叫這些函式就是多餘的。PyFrame_LocalsToFast()
不再有任何效果。現在PyFrame_GetLocals()
為 最佳化作用域 返回一個直寫代理,因此呼叫此函式是多餘的。
Python 3.13 移除了許多私有函式。其中一些可以使用這些替代方案替換
_PyDict_Pop()
:PyDict_Pop()
或PyDict_PopString()
;_PyDict_GetItemWithError()
:PyDict_GetItemRef()
;_PyErr_WriteUnraisableMsg()
:PyErr_FormatUnraisable()
;_PyEval_SetTrace()
:PyEval_SetTrace()
或PyEval_SetTraceAllThreads()
;_PyList_Extend()
:PyList_Extend()
;_PyLong_AsInt()
:PyLong_AsInt()
;_PyMem_RawStrdup()
:strdup()
;_PyMem_Strdup()
:strdup()
;_PyObject_ClearManagedDict()
:PyObject_ClearManagedDict()
;_PyObject_VisitManagedDict()
:PyObject_VisitManagedDict()
;_PyThreadState_UncheckedGet()
:PyThreadState_GetUnchecked()
;_PyTime_AsSecondsDouble()
:PyTime_AsSecondsDouble()
;_PyTime_GetMonotonicClock()
:PyTime_Monotonic()
或PyTime_MonotonicRaw()
;_PyTime_GetPerfCounter()
:PyTime_PerfCounter()
或PyTime_PerfCounterRaw()
;_PyTime_GetSystemClock()
:PyTime_Time()
或PyTime_TimeRaw()
;_PyTime_MAX
:PyTime_MAX
;_PyTime_MIN
:PyTime_MIN
;_PyTime_t
:PyTime_t
;_Py_HashPointer()
:Py_HashPointer()
;_Py_IsFinalizing()
:Py_IsFinalizing()
。
pythoncapi-compat 專案 可用於在 Python 3.12 及更早版本中獲取這些新函式中的大部分。
迴歸測試更改¶
使用
configure
--with-pydebug
構建的 Python 現在支援-X presite=package.module
命令列選項。如果使用,它指定一個模組,該模組應在直譯器生命週期的早期,即在執行site.py
之前匯入。(由 Łukasz Langa 在 gh-110769 中貢獻。)