Python 3.8

Python 3.8.0(正式版)於 2019 年 10 月 14 日發布。3.8 的功能定義於 PEP 569,變更的詳細說明可在 What's New in Python 3.8. 中找到

功能

狀態

PEP 570

僅限位置引數

PEP 572

賦值運算式

已完成

PEP 574

帶頻外資料的 Pickle 協定 5

PEP 578

執行階段稽核掛鉤

PEP 587

Python 初始化組態

PEP 590

Vectorcall:CPython 的快速呼叫協定

雜項

f-string 支援 = 用於自我說明的運算式與除錯

已完成

其他語言變更:

由於實作上的問題,continue 陳述式過去在 finally 子句中是非法的。在 Python 3.8 中此限制已解除

已完成

boolintfractions.Fraction 型別現在擁有如同 floatdecimal.Decimal 中的 as_integer_ratio() 方法

intfloatcomplex 的建構函式現在會使用 __index__() 特殊方法(如果可用),且對應的 __int__()__float__()__complex__() 方法不可用時

新增對正規表示式中 N{name} 跳脫的支援

現在可使用 reversed() 以反向插入順序迭代 dict 與 dictviews

函式呼叫中關鍵字名稱所允許的語法受到進一步限制。特別是不再允許 f((keyword)=arg)

yield 與 return 陳述式中的廣義可迭代解包不再需要外層括號

當程式碼如 [(10, 20) (30, 40)] 中遺漏逗號時,編譯器會顯示帶有實用建議的 SyntaxWarning

datetime.datedatetime.datetime 的子類別與 datetime.timedelta 物件之間的算術運算現在會傳回該子類別的實例,而非基底類別

當 Python 直譯器被 Ctrl-C (SIGINT) 中斷,且產生的 KeyboardInterrupt 例外未被攔截時,Python 行程現在會透過 SIGINT 訊號退出,或以正確的退出碼退出,使呼叫端行程能偵測到它是因 Ctrl-C 而結束

某些進階的程式設計風格需要更新既有函式的 types.CodeType 物件

對於整數,在底數與模數互質的情況下,pow() 函式的三引數形式現在允許指數為負

Dict 生成式已與 dict 字面值同步,使得先計算鍵、再計算值

object.__reduce__() 方法現在可傳回長度為二到六個元素的元組

內建模組的變更:

asyncio

asyncio.run() 已從暫定 API 升級為穩定 API

已完成

執行 python -m asyncio 會啟動原生的非同步 REPL

例外 asyncio.CancelledError 現在繼承自 BaseException 而非 Exception,且不再繼承自 concurrent.futures.CancelledError

已完成

新增 asyncio.Task.get_coro() 以取得 asyncio.Task 內所包裝的協程

Asyncio 任務現在可被命名,可透過將 name 關鍵字引數傳遞給 asyncio.create_task() 或事件迴圈的 create_task() 方法,或在任務物件上呼叫 set_name() 方法

asyncio.loop.create_connection() 新增了 Happy Eyeballs 支援。為指定其行為,新增了兩個參數:happy_eyeballs_delay 與 interleave。

gc

get_objects() 現在可接收一個可選的 generation 參數,用來指示要從哪一個世代取得物件。(不過請注意,雖然 gc 是內建的,但 MicroPython 並未實作 get_objects()

math

新增了新函式 math.dist(),用於計算兩點之間的歐幾里得距離

擴充了 math.hypot() 函式以處理多個維度

新增了新函式 math.prod(),作為類似 sum() 的函式,會傳回一個「起始」值(預設:1)乘以一個可迭代數列的乘積

新增了兩個新的組合數學函式 math.perm()math.comb()

新增了新函式 math.isqrt(),用於在不轉換為浮點數的情況下計算精確的整數平方根

math.factorial() 函式不再接受非類整數的引數

已完成

sys

新增 sys.unraisablehook() 函式,可被覆寫以控制「不可引發例外」的處理方式