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 個“殭屍電池”(舊版 stdlib 模組)已從標準庫中移除:aifcaudioopcgicgitbchunkcryptimghdrmailcapmsilibnisnntplibossaudiodevpipessndhdrspwdsunautelnetlibuuxdrlib

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

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

  • 移除 locale.resetlocale() 函式。

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

  • 移除連結的 classmethod 描述符。

釋出計劃變更

PEP 602(“Python 的年度釋出週期”)已更新,將新版本的完整支援(“錯誤修復”)週期延長至兩年。此更新的政策意味著

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

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

新特性

更好的互動式直譯器

Python 現在預設使用一個新的互動式 shell,該 shell 基於 PyPy 專案中的程式碼。當用戶從互動式終端啟動 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 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。標記為無執行緒的預構建二進位制檔案可以作為官方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,該公司為支援該專案提供了大量的工程資源。

另請參閱

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 直譯器,但它主要用於除錯最佳化管道的早期階段。可以透過使用 --enable-experimental-jit=interpreter 配置 Python 來啟用 Tier 2 直譯器。

  • 啟用 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 目標為第 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-androidx86_64-linux-android 目標為第 3 級支援。32 位目標 arm-linux-androideabii686-linux-android 不是第 3 級支援的平臺,但會提供盡力而為的支援。(PEP 由 Malcolm Smith 撰寫並貢獻了實現,見 gh-116622。)

另請參閱

PEP 730PEP 738

其他語言更改

  • 編譯器現在會刪除文件字串中每行開頭多餘的空格。這減小了 位元組碼快取(例如 .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
    

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

  • 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() 內建函式現在接受 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.sqlite3dbm 的 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 對映來選擇加入新行為。

    (由 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() 方法。這確保在下一個 await 時會引發 CancelledError,因此取消不會丟失。

    這些更改的一個額外好處是,任務組現在保留取消計數 (cancelling())。

    為了處理一些極端情況,當取消計數達到零時,uncancel() 現在可能會重置未記錄的 _must_cancel 標誌。

    (受 Arthur Tacca 在 gh-116720 中報告的問題的啟發。)

  • 當在非活動的 TaskGroup 上呼叫 TaskGroup.create_task() 時,將關閉給定的協程(這可以防止出現關於從未等待給定協程的 RuntimeWarning)。(由 Arthur Tacca 和 Jason Zhang 在 gh-115957 中貢獻。)

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.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

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.errorPatternError 以提高畫質晰度。保留 re.error 以實現向後相容。

shutil

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

site

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

sqlite3

ssl

statistics

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

  • 新增用於從 kde() 建立的估計機率密度函式中取樣的 kde_random()。(由 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() 函式來測試字串是否已被駐留。此函式不保證在 Python 的所有實現中都存在。(由 Serhiy Storchaka 在 gh-78573 中貢獻。)

tempfile

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()。將 zoomsubsample 引數新增到 PhotoImage 方法 copy()。(由 Serhiy Storchaka 在 gh-118225 中貢獻。)

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

traceback

型別

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

型別提示

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

  • audioop

  • chunk

  • cgicgitb

    • 通常情況下,對於 GETHEAD 請求,可以使用 urllib.parse.parse_qsl() 替換 cgi.FieldStorage;對於 POSTPUT 請求,可以使用 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.EmailMessageemail.message.Message 類。

  • crypt 和私有的 _crypt 擴充套件。如果只需要對值進行雜湊處理,可以使用 hashlib 模組作為合適的替代。否則,可以使用 PyPI 上的各種第三方庫。

    • bcrypt:為您的軟體和伺服器提供現代密碼雜湊。

    • passlib:全面的密碼雜湊框架,支援超過 30 種方案。

    • argon2-cffi:安全的 Argon2 密碼雜湊演算法。

    • legacycryptctypes 對 POSIX crypt 庫呼叫及相關功能的包裝器。

    • crypt_rcrypt 模組的分支,是對 crypt_r(3) 庫呼叫及相關功能的包裝器。

  • 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 模組作為現代替代方案。

  • 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

  • 刪除 Python 3.11 中棄用的 locale.resetlocale() 函式。請改用 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

  • 移除在 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

  • 移除自 Python 3.8 以來已棄用的 typing.iotyping.re 名稱空間。這些名稱空間中的項可以直接從 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 中移除。改用 Unicode 字元的 'w' 格式程式碼 (Py_UCS4)。(由 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:

    • 棄用未文件化的 glob0()glob1() 函式。請使用 glob() 並傳遞一個 類路徑物件,該物件指定根目錄到 root_dir 引數。(由 Barney Gale 在 gh-117337 中貢獻。)

  • 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 引數,並棄用將 None 傳遞給這兩種型別的 fields 引數。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 中待刪除

Python 3.15 中待移除的功能

  • 匯入系統

    • 在未能設定 __spec__.cached 的情況下,在模組上設定 __cached__ 已被棄用。在 Python 3.15 中,匯入系統或標準庫將不再設定或考慮 __cached__。( gh-97879)

    • 在未能設定 __spec__.parent 的情況下,在模組上設定 __package__ 已被棄用。在 Python 3.15 中,匯入系統或標準庫將不再設定或考慮 __package__。( gh-97879)

  • ctypes:

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

  • http.server:

    • 過時且很少使用的 CGIHTTPRequestHandler 自 Python 3.13 起已被棄用。沒有直接的替代品。與 CGI 相比,*任何東西* 都更適合將 Web 伺服器與請求處理程式連線起來。

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

  • locale:

  • pathlib:

  • platform:

    • 自 Python 3.13 起,java_ver() 已被棄用。此函式僅對 Jython 支援有用,API 令人困惑,並且在很大程度上未經測試。

  • 執行緒:

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

  • types:

  • typing:

    • 用於建立 NamedTuple 類的未記錄的關鍵字引數語法(例如 Point = NamedTuple("Point", x=int, y=int))自 Python 3.13 起已被棄用。請改用基於類的語法或函式式語法。

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

  • wave:

計劃在 Python 3.16 中移除

  • 匯入系統

    • 在未能設定 __spec__.loader 的同時設定模組的 __loader__ 已被棄用。在 Python 3.16 中,匯入系統或標準庫將不再設定或考慮 __loader__

  • array:

    • 'u' 格式程式碼(wchar_t)自 Python 3.3 起在文件中已被棄用,自 Python 3.13 起在執行時已被棄用。請改用 'w' 格式程式碼(Py_UCS4)表示 Unicode 字元。

  • asyncio:

  • builtins:

    • 自 Python 3.12 起,布林型別的按位取反,~True~False 已被棄用,因為它會產生令人驚訝且不直觀的結果(-2-1)。請改用 not x 來進行布林值的邏輯否定。在極少數情況下,如果您需要底層整數的按位取反,請顯式轉換為 int~int(x))。

  • shutil:

    • 自 Python 3.14 起,ExecError 異常已被棄用。自 Python 3.4 以來,shutil 中的任何函式都未使用過它,現在它是 RuntimeError 的別名。

  • 符號表:

  • sys:

  • tarfile:

    • 自 Python 3.13 起,未記錄且未使用的 TarFile.tarfile 屬性已被棄用。

計劃在未來版本中移除

以下 API 將在未來移除,儘管目前尚未安排移除的日期。

  • argparse:巢狀引數組和巢狀互斥組已被棄用。

  • array'u' 格式程式碼 (gh-57281)

  • builtins:

    • bool(NotImplemented).

    • 生成器: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)

    • 對返回非 int 型別的 __index__()__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 中貢獻。)

  • codeobject.co_lnotab:請使用 codeobject.co_lines() 方法代替。

  • datetime:

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

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

  • gettext:複數形式的值必須為整數。

  • importlib:

    • load_module() 方法:請使用 exec_module() 代替。

    • cache_from_source()debug_override 引數已被棄用:請使用 optimization 引數代替。

  • 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.SSLContextset_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 方法

  • typing.Text (gh-92332)。

  • unittest.IsolatedAsyncioTestCase:從測試用例中返回不是 None 的值已被棄用。

  • urllib.parse 中已棄用的函式:請使用 urlparse() 代替

    • splitattr()

    • splithost()

    • splitnport()

    • splitpasswd()

    • splitport()

    • splitquery()

    • splittag()

    • splittype()

    • splituser()

    • splitvalue()

    • to_bytes()

  • urllib.requestURLopenerFancyURLopener 風格的請求呼叫已被棄用。請使用更新的 urlopen() 函式和方法。

  • wsgirefSimpleHandler.stdout.write() 不應執行部分寫入。

  • xml.etree.ElementTree:測試 Element 的真值已被棄用。在未來的版本中,它將始終返回 True。請優先使用顯式的 len(elem)elem is not None 測試。

  • zipimport.zipimporter.load_module() 已被棄用:請改用 exec_module()

CPython 位元組碼更改

  • 如果 yield 是 yield-from 或 await 的一部分,則 YIELD_VALUE 的 oparg 現在為 1,否則為 0RESUME 的 oparg 已更改,添加了一個位,指示 except-depth 是否為 1,這對於最佳化生成器的關閉是必需的。(由 Irit Katriel 在 gh-111354 中貢獻。)

C API 更改

新特性

更改的 C API

有限 C API 更改

刪除的 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 中已棄用的各種函式

    (由 Victor Stinner 在 gh-105107 中貢獻。)

  • 移除以下在 Python 3.11 中已棄用的用於配置 Python 初始化的舊函式

    使用 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_BEGINPy_TRASHCAN_SAFE_END。將兩者都替換為新的宏 Py_TRASHCAN_BEGINPy_TRASHCAN_END。(由 Irit Katriel 在 gh-105111 中貢獻。)

已棄用的 C API

計劃在 Python 3.14 中移除

將在 Python 3.15 中移除

計劃在未來版本中移除

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

構建變更

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

  • aarch64-linux-androidx86_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 現在預設為 yeslibmpdecimal 的捆綁副本將在 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() 的程式碼執行函式(例如 execeval)必須傳遞一個顯式名稱空間才能在最佳化作用域中訪問它們的結果。(作為 PEP 667 的一部分進行了更改。)

    • 從模組或類作用域中的推導式(包括透過 execeval)呼叫 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.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 中貢獻。)

3.13.1 中的重要更改

sys

  • 之前未公開的特殊函式 sys.getobjects(),它僅存在於 Python 的特殊構建版本中,現在可能會返回來自其他直譯器的物件,而不是呼叫它的直譯器。