Python 3.10

Python 3.10.0(正式版)於 2021 年 10 月 4 日發布。3.10 的功能定義於 PEP 619,而變更的詳細說明可在 What's New in Python 3.10 中找到。

新的語法功能

狀態

PEP 634

結構化模式比對:規格

[1]

PEP 635

結構化模式比對:動機與原理

[1]

PEP 636

結構化模式比對:教學

[1]

bpo-12782

現已正式允許使用加括號的上下文管理器

標準函式庫的新功能

PEP 618

為 zip 加入選用的長度檢查

直譯器改進

PEP 626

為除錯及其他工具提供精確的行號

新的型別標註功能

PEP 604

允許將聯合型別寫成 X | Y

PEP 613

明確的型別別名

PEP 612

參數規格變數

重要的棄用、移除或限制

PEP 644

要求 OpenSSL 1.1.1 或更新版本

PEP 632

棄用 distutils 模組。

不相關

PEP 623

棄用並準備移除 PyUnicodeObject 中的 wstr 成員。

不相關

PEP 624

移除 Py_UNICODE 編碼器 API

不相關

PEP 597

加入選用的 EncodingWarning

其他語言變更:

int 型別新增了一個方法 int.bit_count(),傳回給定整數二進位展開中 1 的個數,亦稱為人口計數(population count)。

dict.keys()dict.values()dict.items() 所傳回的檢視現在都具有 mapping 屬性,可提供一個包裝原始字典的 types.MappingProxyType 物件。

PEP 618zip() 函式現在具有選用的 strict 旗標,用於要求所有可迭代物件具有相同的長度。

接受整數引數的內建函式與擴充函式不再接受 DecimalFraction以及其他只能透過精度損失轉換為整數的物件(例如具有 __int__() 方法但不具有 __index__() 方法者)。

object.__ipow__() 傳回 NotImplemented,運算子現在會正確地依預期回退至 object.__pow__()object.__rpow__()

賦值運算式現在可在集合常值與集合生成式中不加括號使用,亦可用於序列索引中(但不可用於切片)。

函式新增了一個 __builtins__ 屬性,在執行函式時用於查找內建符號,而不再查找 __globals__['__builtins__']。此屬性若 __globals__["__builtins__"] 存在則由其初始化,否則由當前的內建物件初始化。

新增了兩個內建函式 —— aiter()anext(),分別為 iter()next() 提供非同步對應版本。

靜態方法(@staticmethod)與類別方法(@classmethod)現在會繼承方法屬性(__module____name____qualname____doc____annotations__)並具有新的 __wrapped__ 屬性。此外,靜態方法現在可如一般函式般呼叫。

在使用 from __future__ import annotations 時,針對複雜目標(除了 PEP 526 所定義的 simple name 目標以外的一切)的標註不再造成任何執行時影響。

類別與模組物件現在會視需要延遲建立空的標註字典。這些標註字典為了向後相容性而儲存於物件的 __dict__ 中。這改善了使用 __annotations__ 的最佳做法。

由於副作用之故,在 from __future__ import annotations 下,包含 yieldyield fromawait 或具名運算式的標註現在皆被禁止。

from __future__ import annotations 下,使用未繫結的變數、super() 以及其他可能改變符號表處理的運算式作為標註,現在皆不再產生任何效果。

float 型別與 decimal.Decimal 型別之 NaN 值的雜湊值現在取決於物件識別。先前它們即使彼此不相等也總是雜湊為 0。這在建立包含多個 NaN 的字典與集合時,會因過多的雜湊碰撞而造成潛在的二次方執行時行為。

刪除 __debug__ 常數時,現在會引發 SyntaxError(而非 NameError)。

SyntaxError 例外現在具有 end_linenoend_offset 屬性。若無法確定,它們將為 None

內建模組的變更:

asyncio

新增缺少的 connect_accepted_socket() 方法。

array

array.arrayindex() 方法現在具有選用的 startstop 參數。

gc

gc.get_objects()gc.get_referrers()gc.get_referents() 新增稽核掛鉤。

hashlib

hashlib 模組需要 OpenSSL 1.1.1 或更新版本。

hashlib 模組已初步支援 OpenSSL 3.0.0。

pbkdf2_hmac() 的純 Python 回退實作已被棄用。未來 PBKDF2-HMAC 將只在 Python 以 OpenSSL 支援建置時才可使用。

os

為 VxWorks RTOS 新增 os.cpu_count() 支援。

新增一個新函式 os.eventfd() 及相關輔助函式,以包裝 Linux 上的 eventfd2 系統呼叫。

新增 os.splice(),允許在兩個檔案描述子之間移動資料而無需在核心位址空間與使用者位址空間之間複製,其中一個檔案描述子必須指向管道。

為 macOS 新增 O_EVTONLYO_FSYNCO_SYMLINKO_NOFOLLOW_ANY

platform

新增 platform.freedesktop_os_release(),可從 freedesktop.org os-release 標準檔案擷取作業系統識別資訊。

socket

例外 socket.timeout 現在是 TimeoutError 的別名。

新增以 IPPROTO_MPTCP 建立 MPTCP 通訊端的選項。

新增 IP_RECVTOS 選項以接收服務類型(ToS)或 DSCP/ECN 欄位。

ssl

ssl 模組需要 OpenSSL 1.1.1 或更新版本。

ssl 模組已初步支援 OpenSSL 3.0.0,並新增選項 OP_IGNORE_UNEXPECTED_EOF

已棄用的函式以及對已棄用常數的使用現在會產生 DeprecationWarningssl.SSLContext.options 預設已設定 OP_NO_SSLv2OP_NO_SSLv3,因此無法對再次設定該旗標提出警告。

ssl 模組現在具有更安全的預設設定。沒有前向保密性或使用 SHA-1 MAC 的加密套件預設被停用。安全等級 2 禁止安全性低於 112 位元的弱 RSA、DH 與 ECC 金鑰。SSLContext 預設使用最低協定版本 TLS 1.2。這些設定以 Hynek Schlawack 的研究為基礎。

已棄用的協定 SSL 3.0、TLS 1.0 與 TLS 1.1 不再受到官方支援。Python 並不會主動封鎖它們。然而 OpenSSL 建置選項、發行版設定、廠商修補與加密套件可能會阻止握手成功。

ssl.get_server_certificate() 函式新增 timeout 參數。

ssl 模組使用堆積型別(heap-types)與多階段初始化。

新增了一個新的驗證旗標 VERIFY_X509_PARTIAL_CHAIN

sys

新增 sys.orig_argv 屬性:傳遞給 Python 可執行檔的原始命令列引數清單。

新增 sys.stdlib_module_names,內含標準函式庫模組名稱清單。

_thread

_thread.interrupt_main() 現在可接受一個選用的訊號編號以進行模擬(預設仍為 signal.SIGINT)。

備註