Python 3.12 有什麼新功能

編輯者:

Adam Turner

本文介紹了 Python 3.12 與 3.11 相比多了哪些新功能。Python 3.12 於 2023 年 10 月 2 日發布。完整詳情請見 changelog

也參考

PEP 693 -- Python 3.12 發布時程

發布重點摘要

Python 3.12 是 Python 程式語言的穩定版本,包含了語言和標準函式庫的綜合變更。標準函式庫的變更主要集中在清理棄用的 API、可用性和正確性。值得注意的是,distutils 套件已從標準函式庫中移除。ospathlib 中的檔案系統支援進行了許多改進,並且有數個模組得到更好的效能。

語言變更主要集中在可用性,因為 f-字串已經移除了許多限制,並且持續改進 'Did you mean ...' 建議。新的型別參數語法type 陳述式改進了泛型型別型別別名在與靜態型別檢查器一起使用上的效率。

這篇文章並不試圖提供所有新功能的完整規格,而是提供一個方便的概覽。完整詳情應參考文件,如標準函式庫參考語言參考。如果你想了解某個新功能的完整實作和設計理念,請參考該功能的 PEP;但請注意 PEP 通常在功能完全實作後就不再更新。


新增語法特性:

新增語法特性:

直譯器改進:

Python 資料模型改進:

標準函式庫中的顯著改進:

安全性改進:

  • 將於 hashlib 中 SHA1、SHA3、SHA2-384、SHA2-512 和 MD5 內建實作替換為來自 HACL* 專案的經正式驗證的程式碼。這些內建實作仍然作為備援方案 (fallback),僅在 OpenSSL 不提供它們時使用。

C API 改進:

  • PEP 697,不穩定 C API 層

  • PEP 683,不滅物件 (immortal objects)

CPython 實作改進:

  • PEP 709,行內綜合運算 (comprehension inlining)

  • 對 Linux perf 分析器的 CPython 支援

  • 在支援的平台上實作堆疊溢位保護

新增型別特性:

重要的棄用、刪除或限制:

  • PEP 623:從 Python C API 中的 Unicode 物件中刪除 wstr,將每個 str 物件的大小減少至少 8 個位元組。

  • PEP 632:刪除 distutils 套件。請參閱遷移指南以查看替換原有 API 的建議。如果你在 Python 3.12 及後續版本中仍然需要它們,第三方套件 Setuptools 會繼續提供 distutils

  • gh-95299:不再於以 venv 建立的虛擬環境中預先安裝 setuptools。這意味著 distutilssetuptoolspkg_resourceseasy_install 將預設不可用;若要使用這些工具,請在已啟用的虛擬環境中執行 pip install setuptools

  • asynchatasyncoreimp 模組以及幾個 unittest.TestCase方法別名已被刪除。

新增功能

PEP 695:型別參數語法

PEP 484 下的泛型類別和函式是使用較冗長語法來宣告,這使得型別參數的作用域不明確,並且需要顯式地宣告變異數 (variance)。

PEP 695 引入了一種新的、更簡潔和顯式的方法來建立泛型類別函式

def max[T](args: Iterable[T]) -> T:
    ...

class list[T]:
    def __getitem__(self, index: int, /) -> T:
        ...

    def append(self, element: T) -> None:
        ...

此外,PEP 引入了一種使用型別陳述式來宣告型別別名的新方法,該方法會建立一個 TypeAliasType 的實例:

type Point = tuple[float, float]

型別別名也可以是泛型

type Point[T] = tuple[T, T]

新的語法允許宣告