新聞中心
- python 3.8 有什么新變化
- 摘要 — 發(fā)布重點(diǎn)
- 新的特性
- 賦值表達(dá)式
- 僅限位置形參
- 用于已編譯字節(jié)碼文件的并行文件系統(tǒng)緩存
- 調(diào)試構(gòu)建使用與發(fā)布構(gòu)建相同的 ABI
- f-字符串支持
=用于自動(dòng)記錄表達(dá)式和調(diào)試文檔 - PEP 578: Python 運(yùn)行時(shí)審核鉤子
- PEP 587: Python 初始化配置
- PEP 590: Vectorcall: 用于 CPython 的快速調(diào)用協(xié)議
- 具有外部數(shù)據(jù)緩沖區(qū)的 pickle 協(xié)議 5
- 其他語言特性修改
- 新增模塊
- 改進(jìn)的模塊
- ast
- asyncio
- builtins
- collections
- cProfile
- csv
- curses
- ctypes
- datetime
- functools
- gc
- gettext
- gzip
- IDLE 與 idlelib
- inspect
- io
- itertools
- json.tool
- logging
- math
- mmap
- multiprocessing
- os
- os.path
- pathlib
- pickle
- plistlib
- pprint
- py_compile
- shlex
- shutil
- socket
- ssl
- statistics
- sys
- tarfile
- threading
- tokenize
- tkinter
- time
- typing
- unicodedata
- unittest
- venv
- weakref
- xml
- xmlrpc
- 性能優(yōu)化
- 構(gòu)建和 C API 的改變
- 棄用
- API 與特性的移除
- 移植到 Python 3.8
- Python 行為的改變
- Python API 的變化
- C API 的變化
- CPython 字節(jié)碼的改變
- 演示和工具
- Python 3.8.1 中的重要變化
- Python 3.8.8 中的重要變化
- Python 3.8.12 中的重要變化
Python 3.8 有什么新變化
編者

站在用戶的角度思考問題,與客戶深入溝通,找到北屯網(wǎng)站設(shè)計(jì)與北屯網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都做網(wǎng)站、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、空間域名、網(wǎng)頁空間、企業(yè)郵箱。業(yè)務(wù)覆蓋北屯地區(qū)。
Raymond Hettinger(譯者:wh2099 at outlook dot com)
這篇文章介紹了 Python 3.8 相比 3.7 增加的新特性。 Python 3.8 發(fā)布于 2019 年 10 月 14 日。 更詳細(xì)的信息可參閱 更新日志。
摘要 — 發(fā)布重點(diǎn)
新的特性
賦值表達(dá)式
新增的語法 := 可在表達(dá)式內(nèi)部為變量賦值。 它被昵稱為“海象運(yùn)算符”因?yàn)樗芟袷?海象的眼睛和長(zhǎng)牙.jpg)。
在這個(gè)示例中,賦值表達(dá)式可以避免調(diào)用 len() 兩次:
if (n := len(a)) > 10:print(f"List is too long ({n} elements, expected <= 10)")
類似的益處還可出現(xiàn)在正則表達(dá)式匹配中需要使用兩次匹配對(duì)象的情況中,一次檢測(cè)用于匹配是否發(fā)生,另一次用于提取子分組:
discount = 0.0if (mo := re.search(r'(\d+)% discount', advertisement)):discount = float(mo.group(1)) / 100.0
此運(yùn)算符也適用于配合 while 循環(huán)計(jì)算一個(gè)值來檢測(cè)循環(huán)是否終止,而同一個(gè)值又在循環(huán)體中再次被使用的情況:
# Loop over fixed length blockswhile (block := f.read(256)) != '':process(block)
另一個(gè)值得介紹的用例出現(xiàn)于列表推導(dǎo)式中,在篩選條件中計(jì)算一個(gè)值,而同一個(gè)值又在表達(dá)式中需要被使用:
[clean_name.title() for name in namesif (clean_name := normalize('NFC', name)) in allowed_names]
請(qǐng)盡量將海象運(yùn)算符的使用限制在清晰的場(chǎng)合中,以降低復(fù)雜性并提升可讀性。
請(qǐng)參閱 PEP 572 了解詳情。
(由 Morehouse 在 bpo-35224 中貢獻(xiàn)。)
僅限位置形參
There is a new function parameter syntax / to indicate that some function parameters must be specified positionally and cannot be used as keyword arguments. This is the same notation shown by help() for C functions annotated with Larry Hastings’ Argument Clinic tool.
在下面的例子中,形參 a 和 b 為僅限位置形參,c 或 d 可以是位置形參或關(guān)鍵字形參,而 e 或 f 要求為關(guān)鍵字形參:
def f(a, b, /, c, d, *, e, f):print(a, b, c, d, e, f)
以下均為合法的調(diào)用:
f(10, 20, 30, d=40, e=50, f=60)
但是,以下均為不合法的調(diào)用:
f(10, b=20, c=30, d=40, e=50, f=60) # b cannot be a keyword argumentf(10, 20, 30, 40, 50, f=60) # e must be a keyword argument
這種標(biāo)記形式的一個(gè)用例是它允許純 Python 函數(shù)完整模擬現(xiàn)有的用 C 代碼編寫的函數(shù)的行為。 例如,內(nèi)置的 divmod() 函數(shù)不接受關(guān)鍵字參數(shù):
def divmod(a, b, /):"Emulate the built in divmod() function"return (a // b, a % b)
另一個(gè)用例是在不需要形參名稱時(shí)排除關(guān)鍵字參數(shù)。 例如,內(nèi)置的 len() 函數(shù)的簽名為 len(obj, /)。 這可以排除如下這種笨拙的調(diào)用形式:
len(obj='hello') # The "obj" keyword argument impairs readability
另一個(gè)益處是將形參標(biāo)記為僅限位置形參將允許在未來修改形參名而不會(huì)破壞客戶的代碼。 例如,在 statistics 模塊中,形參名 dist 在未來可能被修改。 這使得以下函數(shù)描述成為可能:
def quantiles(dist, /, *, n=4, method='exclusive')...
由于在 / 左側(cè)的形參不會(huì)被公開為可用關(guān)鍵字,其他形參名仍可在 **kwargs 中使用:
>>> def f(a, b, /, **kwargs):... print(a, b, kwargs)...>>> f(10, 20, a=1, b=2, c=3) # a and b are used in two ways10 20 {'a': 1, 'b': 2, 'c': 3}
這極大地簡(jiǎn)化了需要接受任意關(guān)鍵字參數(shù)的函數(shù)和方法的實(shí)現(xiàn)。 例如,以下是一段摘自 collections 模塊的代碼:
class Counter(dict):def __init__(self, iterable=None, /, **kwds):# Note "iterable" is a possible keyword argument
請(qǐng)參閱 PEP 570 了解詳情。
(由 Pablo Galindo 在 bpo-36540 中貢獻(xiàn)。)
用于已編譯字節(jié)碼文件的并行文件系統(tǒng)緩存
新增的 PYTHONPYCACHEPREFIX 設(shè)置 (也可使用 -X pycache_prefix) 可將隱式的字節(jié)碼緩存配置為使用單獨(dú)的并行文件系統(tǒng)樹,而不是默認(rèn)的每個(gè)源代碼目錄下的 __pycache__ 子目錄。
緩存的位置會(huì)在 sys.pycache_prefix 中報(bào)告 (None 表示默認(rèn)位置即 __pycache__ 子目錄)。
(由 Carl Meyer 在 bpo-33499 中貢獻(xiàn)。)
調(diào)試構(gòu)建使用與發(fā)布構(gòu)建相同的 ABI
Python 現(xiàn)在不論是以發(fā)布模式還是調(diào)試模式進(jìn)行構(gòu)建都將使用相同的 ABI。 在 Unix 上,當(dāng) Python 以調(diào)試模式構(gòu)建時(shí),現(xiàn)在將可以加載以發(fā)布模式構(gòu)建的 C 擴(kuò)展和使用穩(wěn)定版 ABI 構(gòu)建的 C 擴(kuò)展。
發(fā)布編譯版和 調(diào)試編譯版 現(xiàn)在都是 ABI 兼容的:定義 Py_DEBUG 宏不會(huì)再應(yīng)用 Py_TRACE_REFS 宏,它引入 了唯一的 ABI 不兼容性。 Py_TRACE_REFS 宏添加了 sys.getobjects() 函數(shù)和 PYTHONDUMPREFS 環(huán)境變量,它可以使用新的 ./configure —with-trace-refs 編譯選項(xiàng)來設(shè)置。 (由 Victor Stinner 在 bpo-36465 中貢獻(xiàn)。)
在 Unix 上,C 擴(kuò)展不會(huì)再被鏈接到 libpython,但 Android 和 Cygwin 例外。 現(xiàn)在靜態(tài)鏈接的 Python 將可以加載使用共享庫 Python 構(gòu)建的 C 擴(kuò)展。 (由 Victor Stinner 在 bpo-21536 中貢獻(xiàn)。)
在 Unix 上,當(dāng) Python 以調(diào)試模式構(gòu)建時(shí),導(dǎo)入操作現(xiàn)在也會(huì)查找在發(fā)布模式下編譯的 C 擴(kuò)展以及使用穩(wěn)定版 ABI 編譯的 C 擴(kuò)展。 (由 Victor Stinner 在 bpo-36722 中貢獻(xiàn)。)
要將 Python 嵌入到一個(gè)應(yīng)用中,必須將新增的 --embed 選項(xiàng)傳給 Python3-config --libs --embed 以獲得 -lpython3.8 (將應(yīng)用鏈接到 libpython)。 要同時(shí)支持 3.8 和舊版本,請(qǐng)先嘗試 python3-config --libs --embed 并在此命令失敗時(shí)回退到 python3-config --libs (即不帶 --embed)。
增加一個(gè) pkg-config python-3.8-embed 模塊用來將 Python 嵌入到一個(gè)應(yīng)用中: pkg-config python-3.8-embed --libs 包含 -lpython3.8。 要同時(shí)支持 3.8 和舊版本,請(qǐng)先嘗試 pkg-config python-X.Y-embed --libs 并在此命令失敗時(shí)回退到 pkg-config python-X.Y --libs (即不帶 --embed) (請(qǐng)將 X.Y 替換為 Python 版本號(hào))。
另一方面,pkg-config python3.8 --libs 不再包含 -lpython3.8。 C 擴(kuò)展不可被鏈接到 libpython (但 Android 和 Cygwin 例外,這兩者的情況由腳本處理);此改變是故意被設(shè)為向下不兼容的。 (由 Victor Stinner 在 bpo-36721 中貢獻(xiàn)。)
f-字符串支持 = 用于自動(dòng)記錄表達(dá)式和調(diào)試文檔
增加 = 說明符用于 f-string。 形式為 f'{expr=}' 的 f-字符串將擴(kuò)展表示為表達(dá)式文本,加一個(gè)等于號(hào),再加表達(dá)式的求值結(jié)果。 例如:
>>> user = 'eric_idle'>>> member_since = date(1975, 7, 31)>>> f'{user=} {member_since=}'"user='eric_idle' member_since=datetime.date(1975, 7, 31)"
通常的 f-字符串格式說明符 允許更細(xì)致地控制所要顯示的表達(dá)式結(jié)果:
>>> delta = date.today() - member_since>>> f'{user=!s} {delta.days=:,d}''user=eric_idle delta.days=16,075'
= 說明符將輸出整個(gè)表達(dá)式,以便詳細(xì)演示計(jì)算過程:
>>> print(f'{theta=} {cos(radians(theta))=:.3f}')theta=30 cos(radians(theta))=0.866
(由 Eric V. Smith 和 Larry Hastings 在 bpo-36817 中貢獻(xiàn)。)
PEP 578: Python 運(yùn)行時(shí)審核鉤子
此 PEP 添加了審核鉤子和已驗(yàn)證開放鉤子。 兩者在 Python 與本機(jī)代碼中均可用。允許以純 Python 代碼編寫的應(yīng)用和框架利用額外的通知,同時(shí)允許嵌入開發(fā)人員或系統(tǒng)管理員部署始終啟用審核的 Python 版本。
請(qǐng)參閱 PEP 578 了解詳情。
PEP 587: Python 初始化配置
PEP 587 增加了一個(gè)新的 C API 用來配置 Python 初始化,提供對(duì)整個(gè)配置過程的更細(xì)致控制以及更好的錯(cuò)誤報(bào)告。
新的結(jié)構(gòu):
-
PyConfig
-
PyPreConfig
-
PyStatus
-
PyWideStringList
新的函數(shù):
-
PyConfig_Clear() -
PyConfig_InitIsolatedConfig() -
PyConfig_InitPythonConfig() -
PyConfig_Read() -
PyConfig_SetArgv() -
PyConfig_SetBytesArgv() -
PyConfig_SetBytesString() -
PyConfig_SetString() -
PyPreConfig_InitIsolatedConfig() -
PyPreConfig_InitPythonConfig() -
PyStatus_Error() -
PyStatus_Exception() -
PyStatus_Exit() -
PyStatus_IsError() -
PyStatus_IsExit() -
PyStatus_NoMemory() -
PyStatus_Ok() -
PyWideStringList_Append() -
PyWideStringList_Insert() -
Py_BytesMain()
-
Py_ExitStatusException() -
Py_InitializeFromConfig()
-
Py_PreInitialize()
-
Py_PreInitializeFromArgs()
-
Py_PreInitializeFromBytesArgs()
-
Py_RunMain()
此 PEP 還為這些內(nèi)部結(jié)構(gòu)添加了 _PyRuntimeState.preconfig (PyPreConfig 類型) 和 PyInterpreterState.config (PyConfig 類型) 字段。 PyInterpreterState.config 成為新的引用配置,替代全局配置變量和其他私有變量。
請(qǐng)參閱 Python 初始化配置 獲取詳細(xì)文檔。
請(qǐng)參閱 PEP 587 了解詳情。
(由 Victor Stinner 在 bpo-36763 中貢獻(xiàn)。)
PEP 590: Vectorcall: 用于 CPython 的快速調(diào)用協(xié)議
將 Vectorcall 協(xié)議 添加到 Python/C API。 它的目標(biāo)是對(duì)已被應(yīng)用于多個(gè)類的現(xiàn)有優(yōu)先進(jìn)行正式化。 任何實(shí)現(xiàn)了可調(diào)用對(duì)象的 靜態(tài)類型 均可使用此協(xié)議。
此特性目前為暫定狀態(tài),計(jì)劃在 Python 3.9 將其完全公開。
請(qǐng)參閱 PEP 590 了解詳情。
(由 Jeroen Demeyer, Mark Shannon 和 Petr Viktorin 在 bpo-36974 中貢獻(xiàn)。)
具有外部數(shù)據(jù)緩沖區(qū)的 pickle 協(xié)議 5
當(dāng)使用 pickle 在 Python 進(jìn)程間傳輸大量數(shù)據(jù)以充分發(fā)揮多核或多機(jī)處理的優(yōu)勢(shì)時(shí),非常重要一點(diǎn)是通過減少內(nèi)存拷貝來優(yōu)化傳輸效率,并可能應(yīng)用一些定制技巧例如針對(duì)特定數(shù)據(jù)的壓縮。
pickle 協(xié)議 5 引入了對(duì)于外部緩沖區(qū)的支持,這樣 PEP 3118 兼容的數(shù)據(jù)可以與主 pickle 流分開進(jìn)行傳輸,這是由通信層來確定的。
請(qǐng)參閱 PEP 574 了解詳情。
(由 Antoine Pitrou 在 bpo-36785 中貢獻(xiàn)。)
其他語言特性修改
-
在之前版本中 continue 語句不允許在 finally 子句中使用,這是因?yàn)榫唧w實(shí)現(xiàn)存在一個(gè)問題。 在 Python 3.8 中此限制已被取消。 (由 Serhiy Storchaka 在 bpo-32489 中貢獻(xiàn)。)
-
bool, int 和 fractions.Fraction 類型現(xiàn)在都有一個(gè) as_integer_ratio() 方法,與 float 和 decimal.Decimal 中的已有方法類似。 這個(gè)微小的 API 擴(kuò)展使得
numerator, denominator = x.as_integer_ratio()這樣的寫法在多種數(shù)字類型上通用成為可能。 (由 Lisa Roach 在 bpo-33073 和 Raymond Hettinger 在 bpo-37819 中貢獻(xiàn)。) -
int, float 和 complex 的構(gòu)造器現(xiàn)在會(huì)使用 __index__() 特殊方法,如果該方法可用而對(duì)應(yīng)的方法 method __int__(), __float__() 或 __complex__() 方法不可用的話。 (由 Serhiy Storchaka 在 bpo-20092 中貢獻(xiàn)。)
-
添加
\N{name}轉(zhuǎn)義符在 正則表達(dá)式 中的支持:>>> notice = 'Copyright ? 2019'>>> copyright_year_pattern = re.compile(r'\N{copyright sign}\s*(\d{4})')>>> int(copyright_year_pattern.search(notice).group(1))2019
(由 Jonathan Eunice 和 Serhiy Storchaka 在 bpo-30688 中貢獻(xiàn)。)
-
現(xiàn)在 dict 和 dictview 可以使用 reversed() 按插入順序反向迭代。 (由 Rémi Lapeyre 在 bpo-33462 中貢獻(xiàn)。)
-
在函數(shù)調(diào)用中允許使用的關(guān)鍵字名稱語法受到進(jìn)一步的限制。 特別地,
f((keyword)=arg)不再被允許。 關(guān)鍵字參數(shù)賦值形式的左側(cè)絕不允許一般標(biāo)識(shí)符以外的其他內(nèi)容。 (由 Benjamin Peterson 在 bpo-34641 中貢獻(xiàn)。) -
在 yield 和 return 語句中的一般可迭代對(duì)象解包不再要求加圓括號(hào)。 這使得 yield 和 return 的語法與正常的賦值語法更為一致:
>>> def parse(family):lastname, *members = family.split()return lastname.upper(), *members>>> parse('simpsons homer marge bart lisa maggie')('SIMPSONS', 'homer', 'marge', 'bart', 'lisa', 'maggie')
(由 David Cuthbert 和 Jordan Chapman 在 bpo-32117 中貢獻(xiàn)。)
-
當(dāng)類似
[(10, 20) (30, 40)]這樣在代碼中少了一個(gè)逗號(hào)時(shí),編譯器將顯示 SyntaxWarning 并附帶更有幫助的提示。 這相比原來用 TypeError 來提示第一個(gè)元組是不可調(diào)用的更容易被理解。 (由 Serhiy Storchaka 在 bpo-15248 中貢獻(xiàn)。) -
datetime.date 或 datetime.datetime 和 datetime.timedelta 對(duì)象之間的算術(shù)運(yùn)算現(xiàn)在將返回相應(yīng)子類的實(shí)例而不是基類的實(shí)例。 這也會(huì)影響到在具體實(shí)現(xiàn)中(直接或間接地)使用了 datetime.timedelta 算術(shù)運(yùn)算的返回類型,例如 astimezone()。 (由 Paul Ganssle 在 bpo-32417 中貢獻(xiàn)。)
-
當(dāng) Python 解釋器通過 Ctrl-C (SIGINT) 被中斷并且所產(chǎn)生的 KeyboardInterrupt 異常未被捕獲,Python 進(jìn)程現(xiàn)在會(huì)通過一個(gè) SIGINT 信號(hào)或是使得發(fā)起調(diào)用的進(jìn)程能檢測(cè)到它是由 Ctrl-C 操作殺死的正確退出代碼來退出。 POSIX 和 Windows 上的終端會(huì)相應(yīng)地使用此代碼在交互式會(huì)話中終止腳本。 (由 Google 的 Gregory P. Smith 在 bpo-1054041 中貢獻(xiàn)。)
-
某些高級(jí)編程風(fēng)格要求為現(xiàn)有的函數(shù)更新 types.CodeType 對(duì)象。 由于代碼對(duì)象是不可變的,需要基于現(xiàn)有代碼對(duì)象模型創(chuàng)建一個(gè)新的代碼對(duì)象。 使用 19 個(gè)形參將會(huì)相當(dāng)繁瑣。 現(xiàn)在,新的
replace()方法使得通過少量修改的形參創(chuàng)建克隆對(duì)象成為可能。下面是一個(gè)修改 statistics.mean() 函數(shù)來防止 data 形參被用作關(guān)鍵字參數(shù)的例子:
>>> from statistics import mean>>> mean(data=[10, 20, 90])40>>> mean.__code__ = mean.__code__.replace(co_posonlyargcount=1)>>> mean(data=[10, 20, 90])Traceback (most recent call last):...TypeError: mean() got some positional-only arguments passed as keyword arguments: 'data'
(由 Victor Stinner 在 bpo-37032 中貢獻(xiàn)。)
-
對(duì)于整數(shù),現(xiàn)在 pow() 函數(shù)的三參數(shù)形式在底數(shù)與模數(shù)不可約的情況下允許指數(shù)為負(fù)值。 隨后它會(huì)在指數(shù)為
-1時(shí)計(jì)算底數(shù)的模乘逆元,并對(duì)其他負(fù)指數(shù)計(jì)算反模的適當(dāng)冪次。 例如,要計(jì)算 38 模 137 的 模乘逆元 則可寫為:>>> pow(38, -1, 137)119>>> 119 * 38 % 1371
模乘逆元在求解 線性丟番圖方程 會(huì)被用到。 例如,想要求出
4258???? + 147???? = 369的整數(shù)解,首先應(yīng)重寫為4258???? ≡ 369 (mod 147)然后求解:>>> x = 369 * pow(4258, -1, 147) % 147>>> y = (4258 * x - 369) // -147>>> 4258 * x + 147 * y369
(由 Mark Dickinson 在 bpo-36027 中貢獻(xiàn)。)
-
字典推導(dǎo)式已與字典字面值實(shí)現(xiàn)同步,會(huì)先計(jì)算鍵再計(jì)算值:
>>> # Dict comprehension>>> cast = {input('role? '): input('actor? ') for i in range(2)}role? King Arthuractor? Chapmanrole? Black Knightactor? Cleese>>> # Dict literal>>> cast = {input('role? '): input('actor? ')}role? Sir Robinactor? Eric Idle
對(duì)執(zhí)行順序的保證對(duì)賦值表達(dá)式來說很有用,因?yàn)樵阪I表達(dá)式中賦值的變量將可在值表達(dá)式中被使用:
>>> names = ['Martin von L?wis', '?ukasz Langa', 'Walter D?rwald']>>> {(n := normalize('NFC', name)).casefold() : n for name in names}{'martin von l?wis': 'Martin von L?wis','?ukasz langa': '?ukasz Langa','walter d?rwald': 'Walter D?rwald'}
(由 J?rn Heissler 在 bpo-35224 中貢獻(xiàn)。)
-
object.__reduce__() 方法現(xiàn)在可返回長(zhǎng)度為二至六個(gè)元素的元組。 之前的上限為五個(gè)。 新增的第六個(gè)可選元素是簽名為
(obj, state)的可調(diào)用對(duì)象。 這樣就允許直接控制特定對(duì)象的狀態(tài)更新。 如果元素值不為 None,該可調(diào)用對(duì)象將優(yōu)先于對(duì)象的__setstate__()方法。 (由 Pierre Glaser 和 Olivier Grisel 在 bpo-35900 中貢獻(xiàn)。)
新增模塊
-
新增的 importlib.metadata 模塊提供了從第三方包讀取元數(shù)據(jù)的(臨時(shí))支持。 例如,它可以提取一個(gè)已安裝軟件包的版本號(hào)、入口點(diǎn)列表等等:
>>> # Note following example requires that the popular "requests">>> # package has been installed.>>>>>> from importlib.metadata import version, requires, files>>> version('requests')'2.22.0'>>> list(requires('requests'))['chardet (<3.1.0,>=3.0.2)']>>> list(files('requests'))[:5][PackagePath('requests-2.22.0.dist-info/INSTALLER'),PackagePath('requests-2.22.0.dist-info/LICENSE'),PackagePath('requests-2.22.0.dist-info/METADATA'),PackagePath('requests-2.22.0.dist-info/RECORD'),PackagePath('requests-2.22.0.dist-info/WHEEL')]
(由 Barry Warsaw 和 Jason R. Coombs 在 bpo-34632 中貢獻(xiàn))。
改進(jìn)的模塊
ast
AST 節(jié)點(diǎn)現(xiàn)在具有 end_lineno 和 end_col_offset 屬性,它們給出節(jié)點(diǎn)結(jié)束的精確位置。 (這只適用于具有 lineno 和 col_offset 屬性的節(jié)點(diǎn)。)
新增函數(shù) ast.get_source_segment() 返回指定 AST 節(jié)點(diǎn)的源代碼。
(由 Ivan Levkivskyi 在 bpo-33416 中貢獻(xiàn)。)
ast.parse() 函數(shù)具有一些新的旗標(biāo):
-
type_comments=True導(dǎo)致其返回與特定 AST 節(jié)點(diǎn)相關(guān)聯(lián)的 PEP 484 和 PEP 526 類型注釋文本; -
mode='func_type'可被用于解析 PEP 484 “簽名類型注釋” (為函數(shù)定義 AST 節(jié)點(diǎn)而返回); -
feature_version=(3, N)允許指定一個(gè)更早的 Python 3 版本。 例如,feature_version=(3, 4)將把 async 和 await 視為非保留字。
(由 Guido van Rossum 在 bpo-35766 中貢獻(xiàn)。)
asyncio
asyncio.run() 已經(jīng)從暫定狀態(tài)晉級(jí)為穩(wěn)定 API。 此函數(shù)可被用于執(zhí)行一個(gè) coroutine 并返回結(jié)果,同時(shí)自動(dòng)管理事件循環(huán)。 例如:
import asyncioasync def main():await asyncio.sleep(0)return 42asyncio.run(main())
這 大致 等價(jià)于:
import asyncioasync def main():await asyncio.sleep(0)return 42loop = asyncio.new_event_loop()asyncio.set_event_loop(loop)try:loop.run_until_complete(main())finally:asyncio.set_event_loop(None)loop.close()
實(shí)際的實(shí)現(xiàn)要更復(fù)雜許多。 因此 asyncio.run() 應(yīng)該作為運(yùn)行 asyncio 程序的首選方式。
(由 Yury Selivanov 在 bpo-32314 中貢獻(xiàn)。)
運(yùn)行 python -m asyncio 將啟動(dòng)一個(gè)原生異步 REPL。 這允許快速體驗(yàn)具有最高層級(jí) await 的代碼。 這時(shí)不再需要直接調(diào)用 asyncio.run(),因?yàn)榇瞬僮鲿?huì)在每次發(fā)起調(diào)用時(shí)產(chǎn)生一個(gè)新事件循環(huán):
$ python -m asyncioasyncio REPL 3.8.0Use "await" directly instead of "asyncio.run()".Type "help", "copyright", "credits" or "license" for more information.>>> import asyncio>>> await asyncio.sleep(10, result='hello')hello
(由 Yury Selivanov 在 bpo-37028 中貢獻(xiàn)。)
異常 asyncio.CancelledError 現(xiàn)在繼承自 BaseException 而不是 Exception 并且不再繼承自 concurrent.futures.CancelledError。 (由 Yury Selivanov 在 bpo-32528 中貢獻(xiàn)。)
在 Windows 上,現(xiàn)在默認(rèn)的事件循環(huán)為 ProactorEventLoop。 (由 Victor Stinner 在 bpo-34687 中貢獻(xiàn)。)
ProactorEventLoop 現(xiàn)在也支持 UDP。 (由 Adam Meily 和 Andrew Svetlov 在 bpo-29883 中貢獻(xiàn)。)
ProactorEventLoop 現(xiàn)在可通過 KeyboardInterrupt (“CTRL+C”) 來中斷。 (由 Vladimir Matveev 在 bpo-23057 中貢獻(xiàn)。)
添加了 asyncio.Task.get_coro() 用來獲取 asyncio.Task 中的已包裝協(xié)程。 (由 Alex Gr?nholm 在 bpo-36999 中貢獻(xiàn)。)
asyncio 任務(wù)現(xiàn)在可以被命名,或者是通過將 name 關(guān)鍵字參數(shù)傳給 asyncio.create_task() 或 create_task() 事件循環(huán)方法,或者是通過在任務(wù)對(duì)象上調(diào)用 set_name() 方法。 任務(wù)名稱在 asyncio.Task 的 repr() 輸出中可見,并且還可以使用 get_name() 方法來獲取。 (由 Alex Gr?nholm 在 bpo-34270 中貢獻(xiàn)。)
將對(duì) Happy Eyeballs 的支持添加到 asyncio.loop.create_connection()。 要指定此行為,已增加了兩個(gè)新的形參: happy_eyeballs_delay 和 interleave。 Happy Eyeballs 算法可提升支持 IPv4 和 IPv6 的應(yīng)用的響應(yīng)速度,具體做法是嘗試同時(shí)使用兩者進(jìn)行連接。 (由 twisteroid ambassador 在 bpo-33530 中貢獻(xiàn)。)
builtins
內(nèi)置的 compile() 已改進(jìn)為可接受 ast.PyCF_ALLOW_TOP_LEVEL_AWAIT 旗標(biāo)。 當(dāng)傳入此新旗標(biāo)時(shí),compile() 將允許通常被視為無效語法的最高層級(jí) await, async for 和 async with 構(gòu)造。 此后將可返回帶有 CO_COROUTINE 旗標(biāo)的異步代碼對(duì)象。 (由 Matthias Bussonnier 在 bpo-34616 中貢獻(xiàn)。)
collections
collections.namedtuple() 的 _asdict() 方法現(xiàn)在將返回 dict 而不是 collections.OrderedDict。 此項(xiàng)更改是由于普通字典自 Python 3.7 起已保證具有確定的元素順序。 如果還需要 OrderedDict 的額外特性,建議的解決方案是將結(jié)果轉(zhuǎn)換為需要的類型: OrderedDict(nt._asdict())。 (由 Raymond Hettinger 在 bpo-35864 中貢獻(xiàn)。)
cProfile
cProfile.Profile 類現(xiàn)在可被用作上下文管理器。 在運(yùn)行時(shí)對(duì)一個(gè)代碼塊實(shí)現(xiàn)性能分析:
import cProfilewith cProfile.Profile() as profiler:# code to be profiled...
(由 Scott Sanderson 在 bpo-29235 中貢獻(xiàn)。)
csv
csv.DictReader 現(xiàn)在將返回 dict 而不是 collections.OrderedDict。 此工具現(xiàn)在會(huì)更快速且消耗更少內(nèi)存同時(shí)仍然保留字段順序。 (由 Michael Selik 在 bpo-34003 中貢獻(xiàn)。)
curses
添加了一個(gè)新變量用于保存下層 ncurses 庫的結(jié)構(gòu)版信息: ncurses_version。 (由 Serhiy Storchaka 在 bpo-31680 中貢獻(xiàn)。)
ctypes
在 Windows 上,CDLL 及其子類現(xiàn)在接受 winmode 形參來指定用于底層 LoadLibraryEx 調(diào)用的旗標(biāo)。 默認(rèn)旗標(biāo)被設(shè)為僅加載來自可信任位置的 DLL 依賴項(xiàng),包括 DLL 的存放路徑(如果加載初始 DLL 時(shí)使用了完整或部分路徑)以及通過 add_dll_directory() 添加的路徑。 (由 Steve Dower 在 bpo-36085 中貢獻(xiàn)。)
datetime
添加了新的替代構(gòu)造器 datetime.date.fromisocalendar() 和 datetime.datetime.fromisocalendar(),它們分別基于 ISO 年份、周序號(hào)和周內(nèi)日序號(hào)來構(gòu)造 date 和 datetime 對(duì)象;這兩者分別是其所對(duì)應(yīng)類中 isocalendar 方法的逆操作。 (由 Paul Ganssle 在 bpo-36004 中貢獻(xiàn)。)
functools
functools.lru_cache() 現(xiàn)在可直接作為裝飾器而不是作為返回裝飾器的函數(shù)。 因此這兩種寫法現(xiàn)在都被支持:
@lru_cachedef f(x):...@lru_cache(maxsize=256)def f(x):...
(由 Raymond Hettinger 在 bpo-36772 中貢獻(xiàn)。)
添加了新的 functools.cached_property() 裝飾器,用于在實(shí)例生命周期內(nèi)緩存的已計(jì)算特征屬性。
import functoolsimport statisticsclass Dataset:def __init__(self, sequence_of_numbers):self.data = sequence_of_numbers@functools.cached_propertydef variance(self):return statistics.variance(self.data)
(由 Carl Meyer 在 bpo-21145 中貢獻(xiàn))
添加了新的 functools.singledispatchmethod() 裝飾器可使用 single dispatch 將方法轉(zhuǎn)換為 泛型函數(shù):
from functools import singledispatchmethodfrom contextlib import suppressclass TaskManager:def __init__(self, tasks):self.tasks = list(tasks)@singledispatchmethoddef discard(self, value):with suppress(ValueError):self.tasks.remove(value)@discard.register(list)def _(self, tasks):targets = set(tasks)self.tasks = [x for x in self.tasks if x not in targets]
(由 Ethan Smith 在 bpo-32380 中貢獻(xiàn))
gc
get_objects() 現(xiàn)在能接受一個(gè)可選的 generation 形參來指定一個(gè)用于獲取對(duì)象的生成器。 (由 Pablo Galindo 在 bpo-36016 中貢獻(xiàn)。)
gettext
添加了 pgettext() 及其變化形式。 (由 Franz Glasner, éric Araujo 和 Cheryl Sabella 在 bpo-2504 中貢獻(xiàn)。)
gzip
添加 mtime 形參到 gzip.compress() 用于可重現(xiàn)的輸出。 (由 Guo Ci Teo 在 bpo-34898 中貢獻(xiàn)。)
對(duì)于特定類型的無效或已損壞 gzip 文件現(xiàn)在將引發(fā) BadGzipFile 而不是 OSError。 (由 Filip Gruszczyński, Michele Orrù 和 Zackery Spytz 在 bpo-6584 中貢獻(xiàn)。)
IDLE 與 idlelib
超過 N 行(默認(rèn)值為 50)的輸出將被折疊為一個(gè)按鈕。 N 可以在 Settings 對(duì)話框的 General 頁的 PyShell 部分中進(jìn)行修改。 數(shù)量較少但是超長(zhǎng)的行可以通過在輸出上右擊來折疊。 被折疊的輸出可通過雙擊按鈕來展開,或是通過右擊按鈕來放入剪貼板或是單獨(dú)的窗口。 (由 Tal Einat 在 bpo-1529353 中貢獻(xiàn)。)
在 Run 菜單中增加了 “Run Customized” 以使用自定義設(shè)置來運(yùn)行模塊。 輸入的任何命令行參數(shù)都會(huì)被加入 sys.argv。 它們?cè)谙麓巫远x運(yùn)行時(shí)會(huì)再次顯示在窗體中。 用戶也可以禁用通常的 Shell 主模塊重啟。 (由 Cheryl Sabella, Terry Jan Reedy 等人在 bpo-5680 和 bpo-37627 中貢獻(xiàn)。)
在 IDLE 編輯器窗口中增加了可選的行號(hào)。 窗口打開時(shí)默認(rèn)不顯示行號(hào),除非在配置對(duì)話框的 General 選項(xiàng)卡中特別設(shè)置。 已打開窗口中的行號(hào)可以在 Options 菜單中顯示和隱藏。 (由 Tal Einat 和 Saimadhav Heblikar 在 bpo-17535 中貢獻(xiàn)。)
現(xiàn)在會(huì)使用 OS 本機(jī)編碼格式在 Python 字符串和 Tcl 對(duì)象間進(jìn)行轉(zhuǎn)換。 這允許在 IDLE 中處理 emoji 和其他非 BMP 字符。 這些字符將可被顯示或是從剪貼板復(fù)制和粘貼。 字符串從 Tcl 到 Python 的來回轉(zhuǎn)換現(xiàn)在不會(huì)再發(fā)生失敗。 (過去八年有許多人都為此付出過努力,問題最終由 Serhiy Storchaka 在 bpo-13153 中解決。)
在 3.8.1 中新增:
添加切換光標(biāo)閃爍停止的選項(xiàng)。 (由 Zackery Spytz 在 bpo-4603 中貢獻(xiàn)。)
Esc 鍵現(xiàn)在會(huì)關(guān)閉 IDLE 補(bǔ)全提示窗口。 (由 Johnny Najera 在 bpo-38944 中貢獻(xiàn)。)
上述修改已被反向移植到 3.7 維護(hù)發(fā)行版中。
添加關(guān)鍵字到模塊名稱補(bǔ)全列表。 (由 Terry J. Reedy 在 bpo-37765 中貢獻(xiàn)。)
inspect
inspect.getdoc() 函數(shù)現(xiàn)在可以找到 __slots__ 的文檔字符串,如果該屬性是一個(gè)元素值為文檔字符串的 dict 的話。 這提供了類似于目前已有的 property(), classmethod() 和 staticmethod() 等函數(shù)的文檔選項(xiàng):
class AudioClip:__slots__ = {'bit_rate': 'expressed in kilohertz to one decimal place','duration': 'in seconds, rounded up to an integer'}def __init__(self, bit_rate, duration):self.bit_rate = round(bit_rate / 1000.0, 1)self.duration = ceil(duration)
(由 Raymond Hettinger 在 bpo-36326 中貢獻(xiàn)。)
io
在開發(fā)模式 (-X env) 和 調(diào)試編譯版 中,io.IOBase 終結(jié)器現(xiàn)在會(huì)在 close() 方法失敗時(shí)將異常寫入日志。 發(fā)生的異常在發(fā)布編譯版中會(huì)被靜默地忽略。 (由 Victor Stinner 在 bpo-18748 中貢獻(xiàn)。)
itertools
itertools.accumulate() 函數(shù)增加了可選的 initial 關(guān)鍵字參數(shù)用來指定一個(gè)初始值:
>>> from itertools import accumulate>>> list(accumulate([10, 5, 30, 15], initial=1000))[1000, 1010, 1015, 1045, 1060]
(由 Lisa Roach 在 bpo-34659 中貢獻(xiàn)。)
json.tool
添加選項(xiàng) --json-lines 用于將每個(gè)輸入行解析為單獨(dú)的 JSON 對(duì)象。 (由 Weipeng Hong 在 bpo-31553 中貢獻(xiàn)。)
logging
為 logging.basicConfig() 添加了 force 關(guān)鍵字參數(shù),當(dāng)設(shè)為真值時(shí),關(guān)聯(lián)到根日志記錄器的任何現(xiàn)有處理程序都將在執(zhí)行由其他參數(shù)所指定的配置之前被移除并關(guān)閉。
這解決了一個(gè)長(zhǎng)期存在的問題。 當(dāng)一個(gè)日志處理器或 basicConfig() 被調(diào)用時(shí),對(duì) basicConfig() 的后續(xù)調(diào)用會(huì)被靜默地忽略。 這導(dǎo)致使用交互提示符或 Jupyter 筆記本更新、試驗(yàn)或講解各種日志配置選項(xiàng)變得相當(dāng)困難。
(由 Raymond Hettinger 提議,由 Dong-hee Na 實(shí)現(xiàn),并由 Vinay Sajip 在 bpo-33897 中完成審核。)
math
添加了新的函數(shù) math.dist() 用于計(jì)算兩點(diǎn)之間的歐幾里得距離。 (由 Raymond Hettinger 在 bpo-33089 中貢獻(xiàn)。)
擴(kuò)展了 math.hypot() 函數(shù)以便處理更多的維度。 之前它僅支持 2-D 的情況。 (由 Raymond Hettinger 在 bpo-33089 中貢獻(xiàn)。)
添加了新的函數(shù) math.prod() 作為的 sum() 同類,該函數(shù)返回 ‘start’ 值 (默認(rèn)值: 1) 乘以一個(gè)數(shù)字可迭代對(duì)象的積:
>>> prior = 0.8>>> likelihoods = [0.625, 0.84, 0.30]>>> math.prod(likelihoods, start=prior)0.126
(由 Pablo Galindo 在 bpo-35606 中貢獻(xiàn)。)
添加了兩個(gè)新的組合函數(shù) math.perm() 和 math.comb():
>>> math.perm(10, 3) # Permutations of 10 things taken 3 at a time720>>> math.comb(10, 3) # Combinations of 10 things taken 3 at a time120
(由 Yash Aggarwal, Keller Fuchs, Serhiy Storchaka 和 Raymond Hettinger 在 bpo-37128, bpo-37178 和 bpo-35431 中貢獻(xiàn)。)
添加了一個(gè)新函數(shù) math.isqrt() 用于計(jì)算精確整數(shù)平方根而無需轉(zhuǎn)換為浮點(diǎn)數(shù)。 該新函數(shù)支持任意大整數(shù)。 它的執(zhí)行速度比 floor(sqrt(n)) 快但是比 math.sqrt() 慢:
>>> r = 650320427>>> s = r ** 2>>> isqrt(s - 1) # correct650320426>>> floor(sqrt(s - 1)) # incorrect650320427
(由 Mark Dickinson 在 bpo-36887 中貢獻(xiàn)。)
函數(shù) math.factorial() 不再接受非整數(shù)類參數(shù)。 (由 Pablo Galindo 在 bpo-33083 中貢獻(xiàn)。)
mmap
mmap.mmap 類現(xiàn)在具有一個(gè) madvise() 方法用于訪問 madvise() 系統(tǒng)調(diào)用。 (由 Zackery Spytz 在 bpo-32941 中貢獻(xiàn)。)
multiprocessing
添加了新的 multiprocessing.shared_memory 模塊。 (由 Davin Potts 在 bpo-35813 中貢獻(xiàn)。)
在macOS上,現(xiàn)在默認(rèn)使用的啟動(dòng)方式是*spawn*啟動(dòng)方式。 (由 Victor Stinner 在 bpo-33725 中貢獻(xiàn)。)
os
在 Windows 上添加了新函數(shù) add_dll_directory() 用于在導(dǎo)入擴(kuò)展模塊或使用 ctypes 加載 DLL 時(shí)為本機(jī)依賴提供額外搜索路徑 。 (由 Steve Dower 在 bpo-36085 中貢獻(xiàn)。)
添加了新的 os.memfd_create() 函數(shù)用于包裝 memfd_create() 系統(tǒng)調(diào)用。 (由 Zackery Spytz 和 Christian Heimes 在 bpo-26836 中貢獻(xiàn)。)
在 Windows 上,大部分用于處理重解析點(diǎn),(包括符號(hào)鏈接和目錄連接)的手動(dòng)邏輯已被委托給操作系統(tǒng)。 特別地,os.stat() 現(xiàn)在將會(huì)遍歷操作系統(tǒng)所支持的任何內(nèi)容,而 os.lstat() 將只打開被標(biāo)識(shí)為“名稱代理”的重解析點(diǎn),而其要由 os.stat() 打開其他的重解析點(diǎn)。 在所有情況下,stat_result.st_mode 將只為符號(hào)鏈接而非其他種類的重解析點(diǎn)設(shè)置 S_IFLNK。 要標(biāo)識(shí)其他種類的重解析點(diǎn),請(qǐng)檢查新的 stat_result.st_reparse_tag 屬性。
在 Windows 上,os.readlink() 現(xiàn)在能夠讀取目錄連接。 請(qǐng)注意 islink() 會(huì)對(duì)目錄連接返回 False,因此首先檢查 islink 的代碼將連續(xù)把連接視為目錄,而會(huì)處理 os.readlink() 所引發(fā)錯(cuò)誤的代碼現(xiàn)在會(huì)把連接視為鏈接。
(由 Steve Dower 在 bpo-37834 中貢獻(xiàn)。)
os.path
返回布爾值結(jié)果的 os.path 函數(shù)例如 exists(), lexists(), isdir(), isfile(), islink(), 以及 ismount() 現(xiàn)在對(duì)于包含在 OS 層級(jí)無法表示的字符或字節(jié)的路徑將會(huì)返回 False 而不是引發(fā) ValueError 或其子類 UnicodeEncodeError 和 UnicodeDecodeError。 (由 Serhiy Storchaka 在 bpo-33721 中貢獻(xiàn)。)
expanduser() 在 Windows 上現(xiàn)在改用 USERPROFILE 環(huán)境變量而不再使用 HOME,后者通常不會(huì)為一般用戶賬戶設(shè)置。 (由 Anthony Sottile 在 bpo-36264 中貢獻(xiàn)。)
isdir() 在 Windows 上將不再為不存在的目錄的鏈接返回 True。
realpath() 在 Windows 上現(xiàn)在會(huì)識(shí)別重解析點(diǎn),包括符號(hào)鏈接和目錄連接。
(由 Steve Dower 在 bpo-37834 中貢獻(xiàn)。)
pathlib
返回布爾值結(jié)果的 pathlib.Path 方法例如 exists(), is_dir(), is_file(), is_mount(), is_symlink(), is_block_device(), is_char_device(), is_fifo(), is_socket() 現(xiàn)在對(duì)于包含在 OS 層級(jí)無法表示的字符或字節(jié)的路徑將會(huì)返回 False 而不是引發(fā) ValueError 或其子類 UnicodeEncodeError。 (由 Serhiy Storchaka 在 bpo-33721 中貢獻(xiàn)。)
添加了 pathlib.Path.link_to() 用于創(chuàng)建指向某個(gè)路徑的硬鏈接。 (由 Joannah Nanjekye 在 bpo-26978 中貢獻(xiàn)。)
pickle
pickle 擴(kuò)展子類化針對(duì) C 優(yōu)化的 Pickler 現(xiàn)在可通過定義特殊的 reducer_override() 方法來重載函數(shù)和類的封存邏輯。 (由 Pierre Glaser 和 Olivier Grisel 在 bpo-35900 中貢獻(xiàn)。)
plistlib
添加了新的 plistlib.UID 并啟動(dòng)了對(duì)讀取和寫入經(jīng)過 NSKeyedArchiver 編碼的二進(jìn)制 plists 的支持。 (由 Jon Janzen 在 bpo-26707 中貢獻(xiàn)。)
pprint
pprint 模塊為一些函數(shù)添加了 sort_dicts 形參。 默認(rèn)情況下,這些函數(shù)會(huì)繼續(xù)在渲染或打印之前對(duì)字典進(jìn)行排序。 但是,如果 sort_dicts 設(shè)為假值,則字典將保持鍵插入時(shí)的順序。 這在調(diào)試期間與 JSON 輸入進(jìn)行比較時(shí)會(huì)很有用。
除此之外,還增加了一個(gè)方便的新函數(shù) pprint.pp(),它類似于 pprint.pprint() 但它的 sort_dicts 默認(rèn)為 False:
>>> from pprint import pprint, pp>>> d = dict(source='input.txt', operation='filter', destination='output.txt')>>> pp(d, width=40) # Original order{'source': 'input.txt','operation': 'filter','destination': 'output.txt'}>>> pprint(d, width=40) # Keys sorted alphabetically{'destination': 'output.txt','operation': 'filter','source': 'input.txt'}
(由 Rémi Lapeyre 在 bpo-30670 中貢獻(xiàn)。)
py_compile
py_compile.compile() 現(xiàn)在支持靜默模式。 (由 Joannah Nanjekye 在 bpo-22640 中貢獻(xiàn)。)
shlex
新增了 shlex.join() 函數(shù)作為 shlex.split() 的逆操作。 (由 Bo Bayles 在 bpo-32102 中貢獻(xiàn)。)
shutil
shutil.copytree() 現(xiàn)在接受新的 dirs_exist_ok 關(guān)鍵字參數(shù)。 (由 Josh Bronson 在 bpo-20849 中貢獻(xiàn)。)
shutil.make_archive() 現(xiàn)在對(duì)新的歸檔默認(rèn)使用 modern pax (POSIX.1-2001) 格式以提升可移植性和標(biāo)準(zhǔn)一致性,此特性繼承自對(duì) tarfile 模塊的相應(yīng)更改。 (由 C.A.M. Gerlach 在 bpo-30661 中貢獻(xiàn)。)
shutil.rmtree() 在 Windows 上現(xiàn)在會(huì)移除目錄連接而不會(huì)遞歸地先移除其中的內(nèi)容。 (由 Steve Dower 在 bpo-37834 中貢獻(xiàn)。)
socket
添加了便捷的 create_server() 和 has_dualstack_ipv6() 函數(shù)以自動(dòng)化在創(chuàng)建服務(wù)器套接字時(shí)通常情況下所必須的任務(wù),包括在同一套接字中同時(shí)接受 IPv4 和 IPv6 連接。 (由 Giampaolo Rodolà 在 bpo-17561 中貢獻(xiàn)。)
socket.if_nameindex(), socket.if_nametoindex() 和 socket.if_indextoname() 函數(shù)已經(jīng)在 Windows 上實(shí)現(xiàn)。 (由 Zacker
分享名稱:創(chuàng)新互聯(lián)Python教程:Python3.8有什么新變化
標(biāo)題來源:http://www.5511xx.com/article/cdgpijg.html


咨詢
建站咨詢
