Python 3.9

Python 3.9.0(正式版)於 2020 年 10 月 5 日發布。3.9 的功能定義於 PEP 596,變更的詳細說明可在 What's New in Python 3.9 中找到

功能

狀態

PEP 573

從 C 擴充型別的方法快速存取模組狀態

不相關

PEP 584

為 dict 新增聯集運算子

已完成 [1]

PEP 585

標準集合中的型別提示泛型

PEP 593

彈性的函式與變數註解

PEP 602

CPython 採用年度發布週期。並非以年度為目標,而是以兩個月的發布週期為目標

不相關

PEP 614

放寬對裝飾器的文法限制

PEP 615

IANA 時區資料庫現在以 zoneinfo 模組形式存在於標準函式庫中

PEP 616

用於移除前綴與後綴的字串方法

PEP 617

CPython 現在使用基於 PEG 的新剖析器

不相關

其他語言變更:

__import__() 現在會引發 ImportError 而非 ValueError

已完成

Python 現在會取得命令列上所指定指令碼檔名的絕對路徑(例如:python3 script.py):__main__ 模組的 __file__ 屬性從相對路徑變成了絕對路徑

預設情況下,為了獲得最佳效能,errors 引數只在第一次編碼/解碼錯誤時才會檢查,且 encoding 引數對於空字串有時會被忽略

對於所有非零的 n,"".replace("", s, n) 現在會傳回 s 而非空字串。它現在與 "".replace("", s) 一致

現在任何有效的運算式都可作為裝飾器。先前的文法限制嚴格得多

現在禁止平行執行 aclose() / asend() / athrow(),且 ag_running 現在反映非同步產生器的實際執行狀態

呼叫 __iter__ 方法時的非預期錯誤,不再被 in 運算子以及 operator 模組的 contains()、indexOf() 與 countOf() 函式中的 TypeError 所遮蔽

在生成式與產生器運算式中,未加括號的 lambda 運算式不再能作為 if 子句的運算式部分

內建模組的變更:

asyncio

由於重大的安全疑慮,asyncio.loop.create_datagram_endpoint() 的 reuse_address 參數不再受支援

新增了一個新協程 shutdown_default_executor(),它會排程關閉預設執行器,並等待 ThreadPoolExecutor 完成關閉。此外,asyncio.run() 也已更新為使用此新協程。

新增了 asyncio.PidfdChildWatcher,這是一個 Linux 特定的子行程監看器實作,會輪詢行程的檔案描述符

新增了一個新的 coroutine asyncio.to_thread()

當因逾時而取消任務時,asyncio.wait_for() 現在即使在逾時 <= 0 的情況下也會等待取消完成,就如同正值逾時時的行為一樣

當以 ssl.SSLSocket socket 呼叫不相容的方法時,asyncio 現在會引發 TyperError

gc

垃圾回收不會在復活的物件上阻塞

新增了一個新函式 gc.is_finalized(),用來檢查某物件是否已被垃圾回收器終結

math

擴充了 math.gcd() 函式以處理多個引數。先前它只支援兩個引數

新增 math.lcm():傳回所指定引數的最小公倍數

新增 math.nextafter():傳回 x 朝向 y 之後的下一個浮點數值

新增 math.ulp():傳回浮點數最低有效位元的值

os

公開了 Linux 特定的 os.pidfd_open()os.P_PIDFD

os.unsetenv() 函式現在於 Windows 上也可用

已完成

os.putenv()os.unsetenv() 函式現在一律可用

已完成

新增 os.waitstatus_to_exitcode() 函式:將 wait 狀態轉換為退出碼

random

新增了一個新的 random.Random.randbytes 方法:產生隨機位元組

sys

新增了一個新的 sys.platlibdir 屬性:平台特定函式庫目錄的名稱

先前,sys.stderr 在非互動式時為區塊緩衝。現在 stderr 預設一律為行緩衝

註解