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
現在作為 2 級 平臺受到支援。wasm32-emscripten
不再是官方支援的平臺。
重要的移除
PEP 594:剩下的 19 個“殭屍電池”(舊版 stdlib 模組)已從標準庫中移除:
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 的年度釋出週期”)已更新,將新版本的完整支援(“錯誤修復”)週期延長至兩年。此更新的政策意味著
Python 3.9–3.12 有一年半的完整支援,之後有三年半的安全修復。
Python 3.13 及更高版本有兩年的完整支援,之後有三年的安全修復。
新特性¶
更好的互動式直譯器¶
Python 現在預設使用一個新的互動式 shell,該 shell 基於 PyPy 專案中的程式碼。當用戶從互動式終端啟動 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
。標記為無執行緒的預構建二進位制檔案可以作為官方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,該公司為支援該專案提供了大量的工程資源。
一個實驗性的即時 (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 直譯器,但它主要用於除錯最佳化管道的早期階段。可以透過使用
--enable-experimental-jit=interpreter
配置 Python 來啟用 Tier 2 直譯器。啟用 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
目標為第 3 級支援(分別對應 2013 年之後釋出的 iPhone 和 iPad 裝置,以及在 Apple 晶片硬體上執行的 Xcode iOS 模擬器)。x86_64-apple-ios-simulator
(在較舊的 x86_64
硬體上執行的 Xcode iOS 模擬器)不是第 3 級支援的平臺,但會提供盡力而為的支援。(PEP 由 Russell Keith-Magee 撰寫並貢獻了實現,見 gh-114099。)
PEP 738:Android 現在是 PEP 11 支援的平臺,其中 aarch64-linux-android
和 x86_64-linux-android
目標為第 3 級支援。32 位目標 arm-linux-androideabi
和 i686-linux-android
不是第 3 級支援的平臺,但會提供盡力而為的支援。(PEP 由 Malcolm Smith 撰寫並貢獻了實現,見 gh-116622。)
其他語言更改¶
編譯器現在會刪除文件字串中每行開頭多餘的空格。這減小了 位元組碼快取(例如
.pyc
檔案)的大小,檔案大小減少約 5%,例如 SQLAlchemy 2.0 中的sqlalchemy.orm.session
。此更改會影響使用文件字串的工具,例如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 中貢獻。)現在允許在
except
塊中使用global
宣告,前提是該全域性變數在else
塊中使用。以前,這會引發錯誤的SyntaxError
。(由 Irit Katriel 在 gh-111123 中貢獻。)新增
PYTHON_FROZEN_MODULES
,一個新的環境變數,用於確定匯入機制是否忽略凍結模組,等效於-X frozen_modules
命令列選項。(由 Yilei Yang 在 gh-111374 中貢獻。)新增透過新的環境變數
PYTHON_PERF_JIT_SUPPORT
和命令列選項-X perf_jit
,支援 perf 分析器在沒有幀指標的情況下工作。(由 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 中貢獻。)
陣列¶
為 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()
方法。這確保在下一個await
時會引發CancelledError
,因此取消不會丟失。這些更改的一個額外好處是,任務組現在保留取消計數 (
cancelling()
)。為了處理一些極端情況,當取消計數達到零時,
uncancel()
現在可能會重置未記錄的_must_cancel
標誌。(受 Arthur Tacca 在 gh-116720 中報告的問題的啟發。)
當在非活動的
TaskGroup
上呼叫TaskGroup.create_task()
時,將關閉給定的協程(這可以防止出現關於從未等待給定協程的RuntimeWarning
)。(由 Arthur Tacca 和 Jason Zhang 在 gh-115957 中貢獻。)
base64¶
新增
z85encode()
和z85decode()
函式,用於將bytes
編碼為 Z85 資料,以及將 Z85 編碼的資料解碼為bytes
。(由 Matan Perelman 在 gh-75299 中貢獻。)
compileall¶
現在使用
os.process_cpu_count()
而不是os.cpu_count()
來選擇預設的工作執行緒和程序數。(由 Victor Stinner 在 gh-109649 中貢獻。)
concurrent.futures¶
現在使用
os.process_cpu_count()
而不是os.cpu_count()
來選擇預設的工作執行緒和程序數。(由 Victor Stinner 在 gh-109649 中貢獻。)
configparser¶
ConfigParser
現在支援未命名部分,允許頂層鍵值對。可以使用新的 *allow_unnamed_section* 引數啟用此功能。(由 Pedro Sousa Lacerda 在 gh-66449 中貢獻。)
copy¶
新的
replace()
函式和replace 協議
使建立物件的修改副本變得更加簡單。這在使用不可變物件時尤其有用。以下型別支援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.clear()
和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 中貢獻。)修復
is_global
和is_private
在IPv4Address
,IPv6Address
,IPv4Network
, 和IPv6Network
中的行為。(由 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()
來選擇預設的工作執行緒和程序數。(由 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_CLOSEFROM
屬性,該屬性位於支援posix_spawn_file_actions_addclosefrom_np()
的平臺上的 file_actions 引數中。(由 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
物件沒有被顯式關閉
,則現在會發出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
可能會拒絕 pre-RFC 5280 或格式錯誤的證書,而底層 OpenSSL 實現可能會接受這些證書。雖然不建議停用此功能,但您可以使用以下方式停用它: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()
建立的估計機率密度函式中取樣的kde_random()
。(由 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()
函式來測試字串是否已被駐留。此函式不保證在 Python 的所有實現中都存在。(由 Serhiy Storchaka 在 gh-78573 中貢獻。)
tempfile¶
在 Windows 上,由於
os.mkdir()
的更改,tempfile.mkdtemp()
使用的預設模式0o700
現在限制對新目錄的訪問。這是對 CVE 2024-4030 的緩解措施。(由 Steve Dower 在 gh-118486 中貢獻。)
time¶
在 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 中貢獻。)在
element_create()
方法的tkinter.ttk.Style
中支援 “vsapi” 元素型別。(由 Serhiy Storchaka 在 gh-68166 中貢獻。)為 Tkinter 小部件新增
after_info()
方法。(由 Cheryl Sabella 在 gh-77020 中貢獻。)向
PhotoImage
新增一個新的copy_replace()
方法,用於將一個影像的區域複製到另一個影像,可能會進行畫素縮放、子取樣或兩者兼有。(由 Serhiy Storchaka 在 gh-118225 中貢獻。)將 from_coords 引數新增到
PhotoImage
方法copy()
、zoom()
和subsample()
。將 zoom 和 subsample 引數新增到PhotoImage
方法copy()
。(由 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 中貢獻。)
型別¶
SimpleNamespace
現在可以接受單個位置引數來初始化名稱空間的引數。此引數必須是對映或鍵值對的可迭代物件。(由 Serhiy Storchaka 在 gh-108191 中貢獻。)
型別提示¶
PEP 705:新增
ReadOnly
,一個特殊的型別提示結構,用於將TypedDict
專案標記為型別檢查器的只讀。新增
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
audioop
chunk
cgi
和cgitb
通常情況下,對於
GET
和HEAD
請求,可以使用urllib.parse.parse_qsl()
替換cgi.FieldStorage
;對於POST
和PUT
請求,可以使用email.message
模組或 multipart 庫。除非輸入是
multipart/form-data
,否則可以使用urllib.parse.parse_qs()
直接處理所需的查詢字串,來替換cgi.parse()
。對於multipart/form-data
,應按照下文關於cgi.parse_multipart()
的說明進行替換。可以使用
email
包中的功能替換cgi.parse_header()
,該包實現了相同的 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
可以使用
email
包中的功能替換cgi.parse_multipart()
,該包實現了相同的 MIME RFC,或者使用 multipart 庫。例如,可以使用email.message.EmailMessage
和email.message.Message
類。
crypt
和私有的_crypt
擴充套件。如果只需要對值進行雜湊處理,可以使用hashlib
模組作為合適的替代。否則,可以使用 PyPI 上的各種第三方庫。bcrypt:為您的軟體和伺服器提供現代密碼雜湊。
passlib:全面的密碼雜湊框架,支援超過 30 種方案。
argon2-cffi:安全的 Argon2 密碼雜湊演算法。
legacycrypt:
ctypes
對 POSIX crypt 庫呼叫及相關功能的包裝器。crypt_r:
crypt
模組的分支,是對 crypt_r(3) 庫呼叫及相關功能的包裝器。
imghdr
:應使用 filetype、puremagic 或 python-magic 庫作為替代。例如,可以使用puremagic.what()
函式替換imghdr.what()
函式,以支援imghdr
支援的所有檔案格式。mailcap
:請改用mimetypes
模組。msilib
nis
nntplib
:請改用 PyPI 上的 pynntp 庫。ossaudiodev
:對於音訊播放,請改用 PyPI 上的 pygame 庫。pipes
:請改用subprocess
模組。 使用shlex.quote()
替換未記錄的pipes.quote
函式。sndhdr
:應使用 filetype、puremagic 或 python-magic 庫作為替代。spwd
:請改用 PyPI 上的 python-pam 庫。sunau
telnetlib
:請改用 PyPI 上的 telnetlib3 或 Exscript 庫。uu
:請改用base64
模組作為現代替代方案。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¶
刪除 Python 3.11 中棄用的
locale.resetlocale()
函式。請改用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¶
移除在 Python 3.6 中已棄用的
tkinter.tix
模組。該模組包裝的第三方 Tix 庫未維護。(由 Zachary Ware 在 gh-75552 中貢獻。)
turtle¶
移除
RawTurtle.settiltangle()
方法,該方法自 Python 3.1 以來在文件中已棄用,自 Python 3.11 以來在執行時已棄用。(由 Hugo van Kemenade 在 gh-104876 中貢獻。)
typing¶
unittest¶
移除以下在 Python 3.11 中已棄用的
unittest
函式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
:-
棄用
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 引數,並棄用將None
傳遞給這兩種型別的 fields 引數。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
:棄用
getmark()
、setmark()
和getmarkers()
Wave_read
和Wave_write
類的方法,將在 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 中貢獻。)-
子程序監視器類
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
對複製、深複製和 pickle 操作的支援沒有文件記錄,效率低下,歷史上存在錯誤且不一致。為了大幅減少程式碼量和維護負擔,這將在 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 起已被棄用。
-
過時且很少使用的
CGIHTTPRequestHandler
自 Python 3.13 起已被棄用。沒有直接的替代品。與 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 令人困惑,並且在很大程度上未經測試。
執行緒
:在 Python 3.15 中,
RLock()
將不接受任何引數。自 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__
。
-
'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 中貢獻。)
-
自 Python 3.12 起,布林型別的按位取反,
~True
或~False
已被棄用,因為它會產生令人驚訝且不直觀的結果(-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)對返回非 int 型別的
__index__()
和__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 中貢獻。)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
選項和協議不帶協議引數的
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
測試。
CPython 位元組碼更改¶
如果 yield 是 yield-from 或 await 的一部分,則
YIELD_VALUE
的 oparg 現在為1
,否則為0
。RESUME
的 oparg 已更改,添加了一個位,指示 except-depth 是否為 1,這對於最佳化生成器的關閉是必需的。(由 Irit Katriel 在 gh-111354 中貢獻。)
C API 更改¶
新特性¶
新增 PyMonitoring C API,用於生成 PEP 669 監控事件
(由 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()
函式,用於從字典中移除一個鍵,並可選擇返回移除的值。這類似於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,則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 應該保持可用,請開啟一個新 issue 請求公開 C API,並在 issue 中新增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()
,它是為與 Python 3.8 的向後相容性而保留的PyInterpreterState_Get()
的別名。可以使用 pythoncapi-compat 專案 在 Python 3.8 和更早的版本上獲取PyInterpreterState_Get()
。(由 Victor Stinner 在 gh-106320 中貢獻。)移除私有的
_PyObject_FastCall()
函式:使用 Python 3.8 版本起可用的PyObject_Vectorcall()
(PEP 590)。(由 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)。在 Python 3.11 中已棄用的用於配置 Python 初始化的函式
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
副本。PyImport_ImportModuleNoBlock()
: 請改用PyImport_ImportModule()
。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
PyThread_ReInitTLS()
:自 Python 3.7 起不再需要。
構建變更¶
arm64-apple-ios
和arm64-apple-ios-simulator
現在都是 PEP 11 第 3 層平臺。(PEP 730 由 Russell Keith-Magee 撰寫並貢獻了實現,參見 gh-114099。)aarch64-linux-android
和x86_64-linux-android
現在都是 PEP 11 第 3 層平臺。(PEP 738 由 Malcolm Smith 撰寫並貢獻了實現,參見 gh-116622。)wasm32-wasi
現在是 PEP 11 第 2 層平臺。(由 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 中貢獻。)構建
sqlite3
擴充套件模組需要 SQLite 3.15.2 或更高版本。(由 Erlend Aasland 在 gh-105875 中貢獻。)CPython 現在預設捆綁了 mimalloc 庫。它在 MIT 許可證下授權;請參閱 mimalloc 許可證。捆綁的 mimalloc 具有自定義更改,請參閱 gh-113141 瞭解詳細資訊。(由 Dino Viehland 在 gh-109914 中貢獻。)
configure
選項--with-system-libmpdec
現在預設為yes
。libmpdecimal
的捆綁副本將在 Python 3.15 中移除。使用
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¶
本節列出了之前描述的更改和其他可能需要更改程式碼的錯誤修復。
Python API 中的更改¶
PEP 667 引入了對
locals()
和f_locals
語義的幾項更改在最佳化作用域中呼叫
locals()
現在會在每次呼叫時生成一個獨立的快照,因此不再隱式更新先前返回的引用。現在,要獲得傳統的 CPython 行為,需要顯式呼叫以使用後續呼叫locals()
的結果來更新最初返回的字典。隱式定位locals()
的程式碼執行函式(例如exec
和eval
)必須傳遞一個顯式名稱空間才能在最佳化作用域中訪問它們的結果。(作為 PEP 667 的一部分進行了更改。)從模組或類作用域中的推導式(包括透過
exec
或eval
)呼叫locals()
現在再次表現得好像推導式是在獨立的巢狀函式中執行一樣(即,不包括來自包含作用域的區域性變數)。在 Python 3.12 中,在實現 PEP 709 時,此行為已更改為包括來自包含作用域的區域性變數。(作為 PEP 667 的一部分進行了更改。)在最佳化作用域中訪問
FrameType.f_locals
現在返回一個直寫代理,而不是一個在不確定的時間更新的快照。如果需要快照,則必須使用dict
或代理的.copy()
方法顯式建立。(作為 PEP 667 的一部分進行了更改。)
當
functools.partial
用作方法時,現在會發出FutureWarning
。此行為將在未來的 Python 版本中發生更改。如果要保留舊行為,請將其包裝在staticmethod()
中。(由 Serhiy Storchaka 在 gh-121027 中貢獻。)現在,如果無法檢索使用者名稱,
OSError
將由getpass.getuser()
引發,而不是在非 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()
返回 最佳化作用域 的寫入代理時,呼叫此函式是多餘的。
迴歸測試更改¶
使用
configure
和--with-pydebug
構建的 Python 現在支援-X presite=package.module
命令列選項。 如果使用此選項,它會指定一個模組,該模組應在直譯器生命週期的早期匯入,在site.py
執行之前。(由 Łukasz Langa 在 gh-110769 中貢獻。)
3.13.1 中的重要更改¶
sys¶
之前未公開的特殊函式
sys.getobjects()
,它僅存在於 Python 的特殊構建版本中,現在可能會返回來自其他直譯器的物件,而不是呼叫它的直譯器。