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


直譯器的改進

Python 資料模型改進

標準庫的重大改進

安全改進

C API 的改進

  • Py_mod_gil 插槽現在用於指示擴充套件模組支援在停用GIL 的情況下執行。

  • PyTime C API 已新增,提供對系統時鐘的訪問。

  • PyMutex 是一個新的輕量級互斥鎖,佔用一個位元組。

  • C API 中有一套新函式用於生成PEP 669 監控事件。

新的型別特性

平臺支援

重要移除

  • PEP 594:剩餘的 19 個“廢棄的模組”(遺留標準庫模組)已從標準庫中移除:aifcaudioopcgicgitbchunkcryptimghdrmailcapmsilibnisnntplibossaudiodevpipessndhdrspwdsunautelnetlibuuxdrlib

  • 移除 2to3 工具和 lib2to3 模組(在 Python 3.11 中已棄用)。

  • 移除 tkinter.tix 模組(在 Python 3.6 中已棄用)。

  • 移除 locale.resetlocale() 函式。

  • 移除 typing.iotyping.re 名稱空間。

  • 移除鏈式 classmethod 描述符。

釋出計劃變更

PEP 602(“Python 年度釋出週期”)已更新,將新版本的完全支援(“bugfix”)期限延長至兩年。此更新的策略意味著:

  • Python 3.9–3.12 有一年半的完全支援,隨後是三年半的安全修復。

  • Python 3.13 及更高版本有兩年的完全支援,隨後是三年的安全修復。

新功能

一個更好的互動式直譯器

Python 現在預設使用基於 PyPy 專案程式碼的新互動式 shell。當用戶從互動式終端啟動 REPL 時,現在支援以下新功能:

  • 多行編輯並保留歷史記錄。

  • 直接支援 REPL 特定命令,如 helpexitquit,無需將其作為函式呼叫。

  • 提示符和回溯預設啟用顏色

  • 使用 F1 進行互動式幫助瀏覽,並帶有單獨的命令歷史記錄。

  • 使用 F2 瀏覽歷史記錄,跳過輸出以及 >>>... 提示符。

  • 使用 F3 的“貼上模式”使貼上更大的程式碼塊更容易(再次按 F3 返回到常規提示符)。

要停用新的互動式 shell,請設定 PYTHON_BASIC_REPL 環境變數。有關互動模式的更多資訊,請參閱互動模式

(由 Pablo Galindo Salgado、Łukasz Langa 和 Lysandros Nikolaou 在 gh-111201 中貢獻,基於 PyPy 專案的程式碼。Windows 支援由 Dino Viehland 和 Anthony Shaw 貢獻。)

改進的錯誤訊息

  • 直譯器現在預設在終端顯示回溯時使用顏色。此功能可以透過新的 PYTHON_COLORS 環境變數以及規範的 NO_COLORFORCE_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.13tpython3.13t.exe。標記為 free-threaded 的預構建二進位制檔案可以作為官方 WindowsmacOS 安裝程式的一部分安裝,或者可以使用 --disable-gil 選項從原始碼構建 CPython。

自由執行緒執行允許透過在可用 CPU 核心上並行執行執行緒來充分利用可用的處理能力。雖然並非所有軟體都會自動從中受益,但考慮到執行緒設計的程式在多核硬體上會執行得更快。自由執行緒模式是實驗性的,改進工作正在進行中:預計會有一些錯誤和顯著的單執行緒效能損失。CPython 的自由執行緒構建支援在執行時使用環境變數 PYTHON_GIL 或命令列選項 -X gil=1 可選地啟用 GIL。

要檢查當前直譯器是否支援自由執行緒,python -VVsys.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 為支援此專案提供了大量的工程資源。

參見

PEP 703 “使 CPython 中的全域性直譯器鎖可選”包含有關這項工作的原理和資訊。

移植擴充套件模組以支援自由執行緒:一個由社群維護的擴充套件作者移植指南。

一個實驗性的即時 (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 的構建時依賴。

參見

PEP 744

(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 APIC API 的移植說明。

(PEP 和實現由 Mark Shannon 和 Tian Gao 在 gh-74929 中貢獻。文件更新由 Guido van Rossum 和 Alyssa Coghlan 提供。)

支援移動平臺

PEP 730:iOS 現在是PEP 11 支援的平臺,arm64-apple-iosarm64-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-androidx86_64-linux-android 目標位於 Tier 3。32 位目標 arm-linux-androideabii686-linux-android 不是 Tier 3 支援的平臺,但將獲得盡力支援。(PEP 由 Malcolm Smith 編寫並貢獻實現,見 gh-116622。)

參見

PEP 730, PEP 738

其他語言更改

  • 編譯器現在從 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
    

    (由 Jelle Zijlstra 在 gh-109118gh-118160 中貢獻。)

  • 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() 內建函式現在接受 globalslocals 引數作為關鍵字引數。(由 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 中貢獻。)

  • bz2lzmatarfilezipfile 模組中,為壓縮和存檔的類檔案物件添加了 namemode 屬性。(由 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 對映來選擇新行為。

    (由 Jelle Zijlstra 在 gh-105858gh-117486gh-118851 中貢獻。)

  • 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.shutdownQueueShutDown 以管理佇列終止。(由 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

compileall

concurrent.futures

configparser

  • ConfigParser 現在支援無名節,這允許頂級鍵值對。這可以透過新的 allow_unnamed_section 引數啟用。(由 Pedro Sousa Lacerda 在 gh-66449 中貢獻。)

copy

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

email

  • 現在,輸出中包含換行符的標頭將用引號括起來。generator 現在將拒絕序列化(寫入)格式不正確或分隔不當的標頭,以免它們被解析為多個標頭或與相鄰資料連線。如果需要關閉此安全功能,請設定 verify_generated_headers。(由 Bas Bloemsaat 和 Petr Viktorin 在 gh-121650 中貢獻。)

  • getaddresses()parseaddr() 現在在遇到無效電子郵件地址的更多情況下返回 ('', '') 對,而不是可能不準確的值。這兩個函式都有一個新的可選 strict 引數(預設為 True)。要獲取舊行為(接受格式錯誤輸入),請使用 strict=Falsegetattr(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

io

ipaddress

itertools

  • batched() 有一個新的 strict 引數,如果最終批次短於指定的批次大小,則會引發 ValueError。(由 Raymond Hettinger 在 gh-113202 中貢獻。)

marshal

  • 在模組函式中新增 allow_code 引數。傳遞 allow_code=False 可防止序列化和反序列化在 Python 版本之間不相容的程式碼物件。(由 Serhiy Storchaka 在 gh-113626 中貢獻。)

math

  • 新函式 fma() 執行融合乘加運算。它只進行一次舍入計算 x * y + z,從而避免任何中間精度損失。它封裝了 C99 提供的 fma() 函式,並遵循 IEEE 754“fusedMultiplyAdd”特殊情況操作的規範。(由 Mark Dickinson 和 Victor Stinner 在 gh-73468 中貢獻。)

mimetypes

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

os.path

  • 新增 isreserved() 以檢查路徑是否在當前系統上保留。此函式僅在 Windows 上可用。(由 Barney Gale 在 gh-88569 中貢獻。)

  • 在 Windows 上,isabs() 不再將以恰好一個斜槓(\/)開頭的路徑視為絕對路徑。(由 Barney Gale 和 Jon Foster 在 gh-44626 中貢獻。)

  • realpath() 現在即使檔案不可訪問,也會解析 MS-DOS 風格的檔名。(由 Moonsik Park 在 gh-82367 中貢獻。)

pathlib

pdb

  • breakpoint()set_trace() 現在立即進入偵錯程式,而不是在下一行程式碼執行時。此更改可防止偵錯程式在 breakpoint() 位於上下文末尾時跳出上下文。(由 Tian Gao 在 gh-118579 中貢獻。)

  • sys.flags.safe_path 設定時,sys.path[0] 不再被除錯指令碼的目錄替換。(由 Tian Gao 和 Christian Walther 在 gh-111762 中貢獻。)

  • zipapp 現在支援作為除錯目標。(由 Tian Gao 在 gh-118501 中貢獻。)

  • pm() 中,透過新的 Pdb 命令 exceptions [exc_number],增加了在事後除錯期間在鏈式異常之間移動的功能。(由 Matthias Bussonnier 在 gh-106676 中貢獻。)

  • 字首為 pdb 命令的表示式和語句現在可以正確識別和執行。(由 Tian Gao 在 gh-108464 中貢獻。)

queue

random

re

  • 為了提高畫質晰度,將 re.error 重新命名為 PatternErrorre.error 保留以實現向後相容性。

shutil

  • chown() 中支援 dir_fdfollow_symlinks 關鍵字引數。(由 Berker Peksag 和 Tahia K 在 gh-62308 中貢獻)

site

  • .pth 檔案現在首先使用 UTF-8 解碼,如果 UTF-8 解碼失敗,則使用 locale 編碼解碼。(由 Inada Naoki 在 gh-117802 中貢獻。)

sqlite3

ssl

statistics

  • 新增 kde() 用於核密度估計。這使得可以從固定數量的離散樣本估計連續機率密度函式。(由 Raymond Hettinger 在 gh-115863 中貢獻。)

  • 新增 kde_random() 用於從 kde() 建立的估計機率密度函式進行取樣。(由 Raymond Hettinger 在 gh-115863 中貢獻。)

subprocess

  • subprocess 模組現在在更多情況下使用 posix_spawn() 函式。

    值得注意的是,當 close_fdsTrue(預設值)時,如果 C 庫提供 posix_spawn_file_actions_addclosefrom_np(),將使用 posix_spawn(),這包括最新版本的 Linux、FreeBSD 和 Solaris。在 Linux 上,這應該與現有的基於 Linux vfork() 的程式碼效能相似。

    如果需要強制 subprocess 從不使用 posix_spawn(),可以將私有控制旋鈕 subprocess._USE_POSIX_SPAWN 設定為 False。如果您設定了此值,請在 問題跟蹤器 中報告您的原因和平臺詳細資訊,以便我們為所有人改進 API 選擇邏輯。(由 Jakub Kulik 在 gh-113117 中貢獻。)

sys

  • 新增 _is_interned() 函式,用於測試字串是否已被 intern。此函式不保證存在於所有 Python 實現中。(由 Serhiy Storchaka 在 gh-78573 中貢獻。)

tempfile

時間

  • 在 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.Styleelement_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() 新增 zoomsubsample 引數。(由 Serhiy Storchaka 在 gh-118225 中貢獻。)

  • 新增 PhotoImage 方法 read() 以從檔案讀取影像,以及 data() 以獲取影像資料。向 write() 方法新增 backgroundgrayscale 引數。(由 Serhiy Storchaka 在 gh-118271 中貢獻。)

traceback

types

  • SimpleNamespace 現在可以接受單個位置引數來初始化名稱空間的引數。此引數必須是對映或鍵值對的可迭代物件。(由 Serhiy Storchaka 在 gh-108191 中貢獻。)

typing

unicodedata

venv

  • 新增對在虛擬環境目錄中建立原始碼控制管理 (SCM) 忽略檔案的支援。預設情況下,支援 Git。這透過 API 作為可選功能實現,可以擴充套件以支援其他 SCM(EnvBuildercreate()),並透過 CLI 使用 --without-scm-ignore-files 作為可選退出功能。(由 Brett Cannon 在 gh-108125 中貢獻。)

warnings

xml

zipimport

  • 新增對 ZIP64 格式檔案的支援。每個人都喜歡大資料,對吧?(由 Tim Hatch 在 gh-94146 中貢獻。)

最佳化

  • 幾個標準庫模組的匯入時間得到了顯著改善。例如,透過移除對 recontextlib 的依賴,typing 模組的匯入時間減少了大約三分之一。其他匯入時間得到加速的模組包括 email.utilsenumfunctoolsimportlib.metadatathreading。(由 Alex Waygood、Shantanu Jain、Adam Turner、Daniel Hollas 等人在 gh-109653 中貢獻。)

  • 對於大型輸入,textwrap.indent() 現在比以前快約 30%。(由 Inada Naoki 在 gh-107369 中貢獻。)

  • subprocess 模組現在在更多情況下使用 posix_spawn() 函式,包括在許多現代平臺上 close_fdsTrue(預設值)時。這應該會在 FreeBSD 和 Solaris 上啟動程序時提供顯著的效能提升。有關詳細資訊,請參閱上面的 subprocess 部分。(由 Jakub Kulik 在 gh-113117 中貢獻。)

已移除的模組和 API

PEP 594:從標準庫中移除“死電池”

PEP 594 提議從標準庫中移除 19 個模組,俗稱“死電池”,因為它們具有歷史性、過時或不安全的地位。以下所有模組在 Python 3.11 中已棄用,現在已被移除:

  • aifc

    • standard-aifc:使用 PyPI 中 aifc 庫的重新分發版本。

  • audioop

  • chunk

  • cgicgitb

    • cgi.FieldStorage 通常可以替換為 urllib.parse.parse_qsl() 用於 GETHEAD 請求,以及 email.message 模組或 multipart 庫用於 POSTPUT 請求。

    • 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.EmailMessageemail.message.Message 類。

    • standard-cgi:和 standard-cgitb:使用 PyPI 中 cgicgitb 庫的重新分發版本。

  • crypt 和私有 _crypt 擴充套件。當只需要對值進行雜湊時,hashlib 模組可能是合適的替代品。否則,PyPI 上有各種第三方庫可用:

  • imghdr:應使用 filetypepuremagicpython-magic 庫作為替代品。例如,puremagic.what() 函式可用於替換 imghdr.what() 函式,適用於 imghdr 支援的所有檔案格式。

  • mailcap:請改用 mimetypes 模組。

  • msilib

  • nis

  • nntplib:請改用 PyPI 中的 pynntp 庫。

  • ossaudiodev:對於音訊播放,請改用 PyPI 中的 pygame 庫。

  • pipes:請改用 subprocess 模組。使用 shlex.quote() 替換未文件化的 pipes.quote 函式。

  • sndhdr:應使用 filetypepuremagicpython-magic 庫作為替代品。

  • spwd:請改用 PyPI 中的 python-pam 庫。

  • sunau

  • telnetlib:請改用 PyPI 中的 telnetlib3Exscript 庫。

  • uu:請改用 base64 模組作為現代替代方案。

    • standard-uu:使用 PyPI 中 uu 庫的重新分發版本。

  • xdrlib

(由 Victor Stinner 和 Zachary Ware 在 gh-104773gh-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

locale

  • 移除 locale.resetlocale() 函式,該函式在 Python 3.11 中已棄用。請改用 locale.setlocale(locale.LC_ALL, "")。(由 Victor Stinner 在 gh-104783 中貢獻。)

opcode

  • opcode.ENABLE_SPECIALIZATION 移至 _opcode.ENABLE_SPECIALIZATION。此欄位在 3.12 中新增,從未被文件化,不打算供外部使用。(由 Irit Katriel 在 gh-105481 中貢獻。)

  • 移除 opcode.is_pseudo()opcode.MIN_PSEUDO_OPCODEopcode.MAX_PSEUDO_OPCODE,它們在 Python 3.12 中新增,但既未文件化,也未透過 dis 公開,也不打算供外部使用。(由 Irit Katriel 在 gh-105481 中貢獻。)

optparse

  • 此模組不再被視為 軟棄用。雖然對於不使用第三方命令列引數處理庫的新專案,仍然首選 argparse,但 argparse 的工作方式有些方面意味著較低級別的 optparse 模組可能為 編寫 引數處理庫和實現比 argparse 更嚴格遵循源於 C getopt() 函式行為的各種 Unix 命令列處理約定的命令列應用程式提供更好的基礎。(由 Alyssa Coghlan 和 Serhiy Storchaka 在 gh-126180 中貢獻。)

pathlib

  • 移除了將 Path 物件用作上下文管理器的功能。此功能已棄用,自 Python 3.9 起已失效。(由 Barney Gale 在 gh-83863 中貢獻。)

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

  • 移除了 typing.iotyping.re 名稱空間,這些名稱空間自 Python 3.8 起已棄用。這些名稱空間中的項可以直接從 typing 模組匯入。(由 Sebastian Rittau 在 gh-92871 中貢獻。)

  • 移除了建立 TypedDict 型別時的關鍵字引數方法,該方法在 Python 3.11 中已棄用。(由 Tomas Roun 在 gh-104786 中貢獻。)

unittest

urllib

webbrowser

  • 移除了未經測試且未文件化的 MacOSX 類,該類在 Python 3.11 中已棄用。請改用 MacOSXOSAScript 類(在 Python 3.2 中引入)。(由 Hugo van Kemenade 在 gh-104804 中貢獻。)

  • 移除了已棄用的 MacOSXOSAScript._name 屬性。請改用 MacOSXOSAScript.name 屬性。(由 Nikita Sobolev 在 gh-105546 中貢獻。)

新棄用

  • 使用者自定義函式:

    • 棄用對函式 __code__ 屬性的賦值,其中新程式碼物件的型別與函式的型別不匹配。不同的型別有:普通函式、生成器、非同步生成器和協程。(由 Irit Katriel 在 gh-81137 中貢獻。)

  • array:

    • 棄用執行時 'u' 格式程式碼 (wchar_t)。此格式程式碼自 Python 3.3 起在文件中棄用,並將在 Python 3.16 中移除。請改用 'w' 格式程式碼 (Py_UCS4) 處理 Unicode 字元。(由 Hugo van Kemenade 在 gh-80480 中貢獻。)

  • ctypes:

    • 棄用未文件化的 SetPointerType() 函式,該函式將在 Python 3.15 中移除。(由 Victor Stinner 在 gh-105733 中貢獻。)

    • 軟棄用 ARRAY() 函式,轉而支援 type * length 乘法。(由 Victor Stinner 在 gh-105733 中貢獻。)

  • decimal:

    • 棄用非標準且未文件化的 Decimal 格式說明符 'N',該說明符僅在 decimal 模組的 C 實現中受支援。(由 Serhiy Storchaka 在 gh-89902 中貢獻。)

  • dis:

    • 棄用 HAVE_ARGUMENT 分隔符。請改用 hasarg 中的成員資格檢查。(由 Irit Katriel 在 gh-109319 中貢獻。)

  • gettext:

    • 棄用在 gettext 模組中,即使未找到翻譯,將非整數數字作為考慮複數形式的函式和方法的引數的做法。(由 Serhiy Storchaka 在 gh-88434 中貢獻。)

  • glob:

  • http.server:

    • 棄用 CGIHTTPRequestHandler,該類將在 Python 3.15 中移除。基於程序的 CGI HTTP 伺服器已經失寵很長時間了。此程式碼已過時、未維護且很少使用。它具有很高的安全性和功能錯誤潛力。(由 Gregory P. Smith 在 gh-109096 中貢獻。)

    • 棄用 python -m http.server 命令列介面的 --cgi 標誌,該標誌將在 Python 3.15 中移除。(由 Gregory P. Smith 在 gh-109096 中貢獻。)

  • mimetypes:

  • re:

    • 棄用將可選的 maxsplitcountflags 引數作為位置引數傳遞給模組級 split()sub()subn() 函式的做法。這些引數將在 Python 的未來版本中變為 僅限關鍵字。(由 Serhiy Storchaka 在 gh-56166 中貢獻。)

  • pathlib:

  • platform:

    • 棄用 java_ver(),該函式將在 Python 3.15 中移除。此函式僅對 Jython 支援有用,API 令人困惑,且大部分未經測試。(由 Nikita Sobolev 在 gh-116349 中貢獻。)

  • pydoc:

    • 棄用未文件化的 ispackage() 函式。(由 Zackery Spytz 在 gh-64020 中貢獻。)

  • sqlite3:

  • sys:

  • tarfile:

    • 棄用未文件化且未使用的 TarFile.tarfile 屬性,該屬性將在 Python 3.16 中移除。(在 gh-115256 中貢獻。)

  • traceback:

  • typing:

    • 棄用建立 NamedTuple 類的未文件化關鍵字引數語法(例如 Point = NamedTuple("Point", x=int, y=int)),該語法將在 Python 3.15 中移除。請改用基於類的語法或函式式語法。(由 Alex Waygood 在 gh-105566 中貢獻。)

    • 棄用建立 NamedTupletyping.TypedDict 類時省略 fields 引數,並棄用向這兩種型別的 fields 引數傳遞 None。Python 3.15 將要求 fields 引數為有效的序列。要建立零欄位的 NamedTuple 類,請使用 class NT(NamedTuple): passNT = NamedTuple("NT", ())。要建立零欄位的 TypedDict 類,請使用 class TD(TypedDict): passTD = TypedDict("TD", {})。(由 Alex Waygood 在 gh-105566gh-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:

Python 3.14 中即將移除

  • argparseargparse.BooleanOptionalActiontypechoicesmetavar 引數已棄用,並將在 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:

    • 子程序觀察器類 asyncio.MultiLoopChildWatcherasyncio.FastChildWatcherasyncio.AbstractChildWatcherasyncio.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'。請參閱 上下文和啟動方法

  • pathlibis_relative_to()relative_to():傳遞額外引數已棄用。

  • pkgutilpkgutil.find_loader()pkgutil.get_loader() 現在會引發 DeprecationWarning;請改用 importlib.util.find_spec()。(由 Nikita Sobolev 在 gh-97850 中貢獻。)

  • pty:

  • sqlite3:

  • urlliburllib.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:

    • 未寫入文件的 ctypes.SetPointerType() 函式自 Python 3.13 起已被棄用。

  • http.server:

    • 過時且很少使用的 CGIHTTPRequestHandler 已從 Python 3.13 開始棄用。沒有直接的替代品。任何將 Web 伺服器與請求處理程式對接的方式都比 CGI 好。

    • python -m http.server 命令列介面的 --cgi 旗標已自 Python 3.13 起棄用。

  • importlib:

    • load_module() 方法:請改用 exec_module()

  • locale:

  • pathlib:

  • platform:

    • java_ver() 已自 Python 3.13 起棄用。此函式僅對 Jython 支援有用,其 API 令人困惑,且基本未經測試。

  • sysconfig:

  • threading:

    • RLock() 在 Python 3.15 中將不再接受任何引數。自 Python 3.14 起,傳遞任何引數的行為已被棄用,因為 Python 版本不允許任何引數,但 C 版本允許任意數量的位置或關鍵字引數,並會忽略所有引數。

  • types:

  • typing:

    • 用於建立 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): passTD = TypedDict("TD", {}) 來建立零欄位的 TypedDict。

    • typing.no_type_check_decorator() 裝飾器函式已自 Python 3.13 起棄用。在 typing 模組中存在八年後,它仍未被任何主流型別檢查器支援。

  • wave:

  • zipimport:

計劃在 Python 3.16 中移除

計劃在 Python 3.17 中移除

  • collections.abc:

    • collections.abc.ByteString 計劃在 Python 3.17 中移除。

      要測試 obj 是否在執行時實現了緩衝區協議,請使用 isinstance(obj, collections.abc.Buffer)。在型別註解中,請使用 Buffer 或顯式指定程式碼支援的型別的聯合型別(例如 bytes | bytearray | memoryview)。

      ByteString 最初旨在作為 bytesbytearray 的超型別抽象類。然而,由於該 ABC 從未有任何方法,因此知道一個物件是 ByteString 的例項實際上並未提供關於該物件的任何有用資訊。其他常見的緩衝區型別(例如 memoryview)也從未被理解為 ByteString 的子型別(無論是在執行時還是透過靜態型別檢查器)。

      有關更多詳細資訊,請參閱 PEP 688。(由 Shantanu Jain 在 gh-91896 中貢獻。)

  • typing:

    • 在 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 最初旨在作為 bytesbytearray 的超型別抽象類。然而,由於該 ABC 從未有任何方法,因此知道一個物件是 ByteString 的例項實際上並未提供關於該物件的任何有用資訊。其他常見的緩衝區型別(例如 memoryview)也從未被理解為 ByteString 的子型別(無論是在執行時還是透過靜態型別檢查器)。

      有關更多詳細資訊,請參閱 PEP 688。(由 Shantanu Jain 在 gh-91896 中貢獻。)

計劃在未來版本中移除

以下 API 將在未來移除,但目前尚未確定移除日期。

  • argparse:

    • 巢狀引數組和巢狀互斥組的做法已被棄用。

    • add_argument_group() 傳遞未寫入文件的關鍵字引數 prefix_chars 的做法現已棄用。

    • argparse.FileType 型別轉換器已被棄用。

  • builtins:

    • 生成器:throw(type, exc, tb)athrow(type, exc, tb) 簽名已被棄用:請改用單引數簽名的 throw(exc)athrow(exc)

    • 目前 Python 接受數字字面量緊跟關鍵字,例如 0in x1or x0if 1else 2。它允許令人困惑和模稜兩可的表示式,如 [0x1for x in y](可解釋為 [0x1 for x in y][0x1f or x in y])。如果數字字面量緊跟關鍵字 andelseforifinisor 之一,則會引發語法警告。在未來的版本中,這將更改為語法錯誤。( gh-87999 )

    • __index__()__int__() 方法返回非 int 型別的支援:這些方法將被要求返回 int 的嚴格子類的例項。

    • __float__() 方法返回 float 的嚴格子類的支援:這些方法將被要求返回 float 的例項。

    • __complex__() 方法返回 complex 的嚴格子類的支援:這些方法將被要求返回 complex 的例項。

    • int() 委託給 __trunc__() 方法的做法。

    • complex() 建構函式中將複數作為 realimag 引數傳遞的做法現已棄用;它應該僅作為單個位置引數傳遞。(由 Serhiy Storchaka 在 gh-109218 中貢獻。)

  • calendarcalendar.Januarycalendar.February 常量已棄用,並由 calendar.JANUARYcalendar.FEBRUARY 取代。(由 Prince Roshan 在 gh-103636 中貢獻。)

  • codecs:請使用 open() 而不是 codecs.open()。(gh-133038

  • codeobject.co_lnotab:請改用 codeobject.co_lines() 方法。

  • datetime:

    • utcnow():請使用 datetime.datetime.now(tz=datetime.UTC)

    • utcfromtimestamp():請使用 datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)

  • gettext:複數值必須是整數。

  • importlib:

  • importlib.metadata:

    • EntryPoints 元組介面。

    • 返回值的隱式 None

  • loggingwarn() 方法已自 Python 3.3 起棄用,請改用 warning()

  • mailbox:使用 StringIO 輸入和文字模式已被棄用,請改用 BytesIO 和二進位制模式。

  • os:在多執行緒程序中呼叫 os.register_at_fork()

  • pydoc.ErrorDuringImportexc_info 引數使用元組值的做法已被棄用,請改用異常例項。

  • re:現在對正則表示式中的數字組引用和組名應用了更嚴格的規則。現在只接受 ASCII 數字序列作為數字引用。位元組串模式和替換字串中的組名現在只能包含 ASCII 字母、數字和下劃線。(由 Serhiy Storchaka 在 gh-91760 中貢獻。)

  • sre_compilesre_constantssre_parse 模組。

  • shutilrmtree()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 方法

  • typing.Text (gh-92332)。

  • 內部類 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()

  • wsgirefSimpleHandler.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,否則為 0RESUME 的操作碼已更改,添加了一個位,指示 except-depth 是否為 1,這對於最佳化生成器的關閉是必需的。(由 Irit Katriel 在 gh-111354 中貢獻。)

C API 更改

新功能

已更改的 C API

受限 C API 更改

已移除的 C API

已棄用的 C API

Python 3.14 中即將移除

Python 3.15 中即將移除

Python 3.16 中即將移除

  • 捆綁的 libmpdec 副本。

計劃在 Python 3.18 中移除

未來版本中即將移除

以下 API 已被棄用並將被移除,但目前尚未確定移除日期。

構建更改

  • arm64-apple-iosarm64-apple-ios-simulator 現在都是 PEP 11 第三層平臺。(Russell Keith-Magee 貢獻了 PEP 730 的編寫和實現,參見 gh-114099。)

  • aarch64-linux-androidx86_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

  • errnofcntlgrpmd5pwdresourcetermioswinsound_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() 為目標的程式碼執行函式(例如 execeval)必須傳遞一個顯式名稱空間才能在最佳化範圍內訪問其結果。(作為 PEP 667 的一部分進行了更改。)

    • 在模組或類作用域的推導式中呼叫 locals() (包括透過 execeval) 再次表現為推導式作為獨立的巢狀函式執行 (即不包含包含作用域中的區域性變數)。在 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.GzipFilemode 屬性的值現在是字串('rb''wb'),而不是整數(12)。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_tptrdiff_t 型別。顯式包含 <stddef.h> 已經被所有其他平臺所需要,HAVE_STDDEF_H 宏只在 Windows 上定義。(由 Victor Stinner 在 gh-108765 中貢獻。)

  • 如果定義了 Py_LIMITED_API 宏,則 Py_BUILD_COREPy_BUILD_CORE_BUILTINPy_BUILD_CORE_MODULE 宏現在會被 <Python.h> 取消定義。(由 Victor Stinner 在 gh-85283 中貢獻。)

  • 舊的垃圾回收宏 Py_TRASHCAN_SAFE_BEGINPy_TRASHCAN_SAFE_END 已被移除。它們應該被新的宏 Py_TRASHCAN_BEGINPy_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 中貢獻。)

迴歸測試更改

  • 使用 configure --with-pydebug 構建的 Python 現在支援 -X presite=package.module 命令列選項。如果使用,它指定一個模組,該模組應在直譯器生命週期的早期,即在執行 site.py 之前匯入。(由 Łukasz Langa 在 gh-110769 中貢獻。)