新聞中心
- python 3.8 有什么新變化
- 摘要 — 發(fā)布重點
- 新的特性
- 賦值表達(dá)式
- 僅限位置形參
- 用于已編譯字節(jié)碼文件的并行文件系統(tǒng)緩存
- 調(diào)試構(gòu)建使用與發(fā)布構(gòu)建相同的 ABI
- f-字符串支持
=用于自動記錄表達(dá)式和調(diào)試文檔 - PEP 578: Python 運(yùn)行時審核鉤子
- 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è)計與北屯網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都做網(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ā)布重點
新的特性
賦值表達(dá)式
新增的語法 := 可在表達(dá)式內(nèi)部為變量賦值。 它被昵稱為“海象運(yùn)算符”因為它很像是 海象的眼睛和長牙.jpg)。
在這個示例中,賦值表達(dá)式可以避免調(diào)用 len() 兩次:
if (n := len(a)) > 10:print(f"List is too long ({n} elements, expected <= 10)")
類似的益處還可出現(xiàn)在正則表達(dá)式匹配中需要使用兩次匹配對象的情況中,一次檢測用于匹配是否發(fā)生,另一次用于提取子分組:
discount = 0.0if (mo := re.search(r'(\d+)% discount', advertisement)):discount = float(mo.group(1)) / 100.0
此運(yùn)算符也適用于配合 while 循環(huán)計算一個值來檢測循環(huán)是否終止,而同一個值又在循環(huán)體中再次被使用的情況:
# Loop over fixed length blockswhile (block := f.read(256)) != '':process(block)
另一個值得介紹的用例出現(xiàn)于列表推導(dǎo)式中,在篩選條件中計算一個值,而同一個值又在表達(dá)式中需要被使用:
[clean_name.title() for name in namesif (clean_name := normalize('NFC', name)) in allowed_names]
請盡量將海象運(yùn)算符的使用限制在清晰的場合中,以降低復(fù)雜性并提升可讀性。
請參閱 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)記形式的一個用例是它允許純 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)
另一個用例是在不需要形參名稱時排除關(guān)鍵字參數(shù)。 例如,內(nèi)置的 len() 函數(shù)的簽名為 len(obj, /)。 這可以排除如下這種笨拙的調(diào)用形式:
len(obj='hello') # The "obj" keyword argument impairs readability
另一個益處是將形參標(biāo)記為僅限位置形參將允許在未來修改形參名而不會破壞客戶的代碼。 例如,在 statistics 模塊中,形參名 dist 在未來可能被修改。 這使得以下函數(shù)描述成為可能:
def quantiles(dist, /, *, n=4, method='exclusive')...
由于在 / 左側(cè)的形參不會被公開為可用關(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}
這極大地簡化了需要接受任意關(guān)鍵字參數(shù)的函數(shù)和方法的實現(xiàn)。 例如,以下是一段摘自 collections 模塊的代碼:
class Counter(dict):def __init__(self, iterable=None, /, **kwds):# Note "iterable" is a possible keyword argument
請參閱 PEP 570 了解詳情。
(由 Pablo Galindo 在 bpo-36540 中貢獻(xiàn)。)
用于已編譯字節(jié)碼文件的并行文件系統(tǒng)緩存
新增的 PYTHONPYCACHEPREFIX 設(shè)置 (也可使用 -X pycache_prefix) 可將隱式的字節(jié)碼緩存配置為使用單獨的并行文件系統(tǒng)樹,而不是默認(rèn)的每個源代碼目錄下的 __pycache__ 子目錄。
緩存的位置會在 sys.pycache_prefix 中報告 (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)建時,現(xiàn)在將可以加載以發(fā)布模式構(gòu)建的 C 擴(kuò)展和使用穩(wěn)定版 ABI 構(gòu)建的 C 擴(kuò)展。
發(fā)布編譯版和 調(diào)試編譯版 現(xiàn)在都是 ABI 兼容的:定義 Py_DEBUG 宏不會再應(yīng)用 Py_TRACE_REFS 宏,它引入 了唯一的 ABI 不兼容性。 Py_TRACE_REFS 宏添加了 sys.getobjects() 函數(shù)和 PYTHONDUMPREFS 環(huán)境變量,它可以使用新的 ./configure —with-trace-refs 編譯選項來設(shè)置。 (由 Victor Stinner 在 bpo-36465 中貢獻(xiàn)。)
在 Unix 上,C 擴(kuò)展不會再被鏈接到 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)建時,導(dǎo)入操作現(xiàn)在也會查找在發(fā)布模式下編譯的 C 擴(kuò)展以及使用穩(wěn)定版 ABI 編譯的 C 擴(kuò)展。 (由 Victor Stinner 在 bpo-36722 中貢獻(xiàn)。)
要將 Python 嵌入到一個應(yīng)用中,必須將新增的 --embed 選項傳給 Python3-config --libs --embed 以獲得 -lpython3.8 (將應(yīng)用鏈接到 libpython)。 要同時支持 3.8 和舊版本,請先嘗試 python3-config --libs --embed 并在此命令失敗時回退到 python3-config --libs (即不帶 --embed)。
增加一個 pkg-config python-3.8-embed 模塊用來將 Python 嵌入到一個應(yīng)用中: pkg-config python-3.8-embed --libs 包含 -lpython3.8。 要同時支持 3.8 和舊版本,請先嘗試 pkg-config python-X.Y-embed --libs 并在此命令失敗時回退到 pkg-config python-X.Y --libs (即不帶 --embed) (請將 X.Y 替換為 Python 版本號)。
另一方面,pkg-config python3.8 --libs 不再包含 -lpython3.8。 C 擴(kuò)展不可被鏈接到 libpython (但 Android 和 Cygwin 例外,這兩者的情況由腳本處理);此改變是故意被設(shè)為向下不兼容的。 (由 Victor Stinner 在 bpo-36721 中貢獻(xiàn)。)
f-字符串支持 = 用于自動記錄表達(dá)式和調(diào)試文檔
增加 = 說明符用于 f-string。 形式為 f'{expr=}' 的 f-字符串將擴(kuò)展表示為表達(dá)式文本,加一個等于號,再加表達(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'
= 說明符將輸出整個表達(dá)式,以便詳細(xì)演示計算過程:
>>> 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)行時審核鉤子
此 PEP 添加了審核鉤子和已驗證開放鉤子。 兩者在 Python 與本機(jī)代碼中均可用。允許以純 Python 代碼編寫的應(yīng)用和框架利用額外的通知,同時允許嵌入開發(fā)人員或系統(tǒng)管理員部署始終啟用審核的 Python 版本。
請參閱 PEP 578 了解詳情。
PEP 587: Python 初始化配置
PEP 587 增加了一個新的 C API 用來配置 Python 初始化,提供對整個配置過程的更細(xì)致控制以及更好的錯誤報告。
新的結(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 成為新的引用配置,替代全局配置變量和其他私有變量。
請參閱 Python 初始化配置 獲取詳細(xì)文檔。
請參閱 PEP 587 了解詳情。
(由 Victor Stinner 在 bpo-36763 中貢獻(xiàn)。)
PEP 590: Vectorcall: 用于 CPython 的快速調(diào)用協(xié)議
將 Vectorcall 協(xié)議 添加到 Python/C API。 它的目標(biāo)是對已被應(yīng)用于多個類的現(xiàn)有優(yōu)先進(jìn)行正式化。 任何實現(xiàn)了可調(diào)用對象的 靜態(tài)類型 均可使用此協(xié)議。
此特性目前為暫定狀態(tài),計劃在 Python 3.9 將其完全公開。
請參閱 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)勢時,非常重要一點是通過減少內(nèi)存拷貝來優(yōu)化傳輸效率,并可能應(yīng)用一些定制技巧例如針對特定數(shù)據(jù)的壓縮。
pickle 協(xié)議 5 引入了對于外部緩沖區(qū)的支持,這樣 PEP 3118 兼容的數(shù)據(jù)可以與主 pickle 流分開進(jìn)行傳輸,這是由通信層來確定的。
請參閱 PEP 574 了解詳情。
(由 Antoine Pitrou 在 bpo-36785 中貢獻(xiàn)。)
其他語言特性修改
-
在之前版本中 continue 語句不允許在 finally 子句中使用,這是因為具體實現(xiàn)存在一個問題。 在 Python 3.8 中此限制已被取消。 (由 Serhiy Storchaka 在 bpo-32489 中貢獻(xiàn)。)
-
bool, int 和 fractions.Fraction 類型現(xiàn)在都有一個 as_integer_ratio() 方法,與 float 和 decimal.Decimal 中的已有方法類似。 這個微小的 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)在會使用 __index__() 特殊方法,如果該方法可用而對應(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)識符以外的其他內(nèi)容。 (由 Benjamin Peterson 在 bpo-34641 中貢獻(xiàn)。) -
在 yield 和 return 語句中的一般可迭代對象解包不再要求加圓括號。 這使得 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)]這樣在代碼中少了一個逗號時,編譯器將顯示 SyntaxWarning 并附帶更有幫助的提示。 這相比原來用 TypeError 來提示第一個元組是不可調(diào)用的更容易被理解。 (由 Serhiy Storchaka 在 bpo-15248 中貢獻(xiàn)。) -
datetime.date 或 datetime.datetime 和 datetime.timedelta 對象之間的算術(shù)運(yùn)算現(xiàn)在將返回相應(yīng)子類的實例而不是基類的實例。 這也會影響到在具體實現(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)在會通過一個 SIGINT 信號或是使得發(fā)起調(diào)用的進(jìn)程能檢測到它是由 Ctrl-C 操作殺死的正確退出代碼來退出。 POSIX 和 Windows 上的終端會相應(yīng)地使用此代碼在交互式會話中終止腳本。 (由 Google 的 Gregory P. Smith 在 bpo-1054041 中貢獻(xiàn)。)
-
某些高級編程風(fēng)格要求為現(xiàn)有的函數(shù)更新 types.CodeType 對象。 由于代碼對象是不可變的,需要基于現(xiàn)有代碼對象模型創(chuàng)建一個新的代碼對象。 使用 19 個形參將會相當(dāng)繁瑣。 現(xiàn)在,新的
replace()方法使得通過少量修改的形參創(chuàng)建克隆對象成為可能。下面是一個修改 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)。)
-
對于整數(shù),現(xiàn)在 pow() 函數(shù)的三參數(shù)形式在底數(shù)與模數(shù)不可約的情況下允許指數(shù)為負(fù)值。 隨后它會在指數(shù)為
-1時計算底數(shù)的模乘逆元,并對其他負(fù)指數(shù)計算反模的適當(dāng)冪次。 例如,要計算 38 模 137 的 模乘逆元 則可寫為:>>> pow(38, -1, 137)119>>> 119 * 38 % 1371
模乘逆元在求解 線性丟番圖方程 會被用到。 例如,想要求出
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)式已與字典字面值實現(xiàn)同步,會先計算鍵再計算值:
>>> # 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
對執(zhí)行順序的保證對賦值表達(dá)式來說很有用,因為在鍵表達(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)在可返回長度為二至六個元素的元組。 之前的上限為五個。 新增的第六個可選元素是簽名為
(obj, state)的可調(diào)用對象。 這樣就允許直接控制特定對象的狀態(tài)更新。 如果元素值不為 None,該可調(diào)用對象將優(yōu)先于對象的__setstate__()方法。 (由 Pierre Glaser 和 Olivier Grisel 在 bpo-35900 中貢獻(xiàn)。)
新增模塊
-
新增的 importlib.metadata 模塊提供了從第三方包讀取元數(shù)據(jù)的(臨時)支持。 例如,它可以提取一個已安裝軟件包的版本號、入口點列表等等:
>>> # 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é)點現(xiàn)在具有 end_lineno 和 end_col_offset 屬性,它們給出節(jié)點結(jié)束的精確位置。 (這只適用于具有 lineno 和 col_offset 屬性的節(jié)點。)
新增函數(shù) ast.get_source_segment() 返回指定 AST 節(jié)點的源代碼。
(由 Ivan Levkivskyi 在 bpo-33416 中貢獻(xiàn)。)
ast.parse() 函數(shù)具有一些新的旗標(biāo):
-
type_comments=True導(dǎo)致其返回與特定 AST 節(jié)點相關(guān)聯(lián)的 PEP 484 和 PEP 526 類型注釋文本; -
mode='func_type'可被用于解析 PEP 484 “簽名類型注釋” (為函數(shù)定義 AST 節(jié)點而返回); -
feature_version=(3, N)允許指定一個更早的 Python 3 版本。 例如,feature_version=(3, 4)將把 async 和 await 視為非保留字。
(由 Guido van Rossum 在 bpo-35766 中貢獻(xiàn)。)
asyncio
asyncio.run() 已經(jīng)從暫定狀態(tài)晉級為穩(wěn)定 API。 此函數(shù)可被用于執(zhí)行一個 coroutine 并返回結(jié)果,同時自動管理事件循環(huán)。 例如:
import asyncioasync def main():await asyncio.sleep(0)return 42asyncio.run(main())
這 大致 等價于:
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()
實際的實現(xiàn)要更復(fù)雜許多。 因此 asyncio.run() 應(yīng)該作為運(yùn)行 asyncio 程序的首選方式。
(由 Yury Selivanov 在 bpo-32314 中貢獻(xiàn)。)
運(yùn)行 python -m asyncio 將啟動一個原生異步 REPL。 這允許快速體驗具有最高層級 await 的代碼。 這時不再需要直接調(diào)用 asyncio.run(),因為此操作會在每次發(fā)起調(diào)用時產(chǎn)生一個新事件循環(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ù)對象上調(diào)用 set_name() 方法。 任務(wù)名稱在 asyncio.Task 的 repr() 輸出中可見,并且還可以使用 get_name() 方法來獲取。 (由 Alex Gr?nholm 在 bpo-34270 中貢獻(xiàn)。)
將對 Happy Eyeballs 的支持添加到 asyncio.loop.create_connection()。 要指定此行為,已增加了兩個新的形參: happy_eyeballs_delay 和 interleave。 Happy Eyeballs 算法可提升支持 IPv4 和 IPv6 的應(yīng)用的響應(yīng)速度,具體做法是嘗試同時使用兩者進(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)時,compile() 將允許通常被視為無效語法的最高層級 await, async for 和 async with 構(gòu)造。 此后將可返回帶有 CO_COROUTINE 旗標(biāo)的異步代碼對象。 (由 Matthias Bussonnier 在 bpo-34616 中貢獻(xiàn)。)
collections
collections.namedtuple() 的 _asdict() 方法現(xiàn)在將返回 dict 而不是 collections.OrderedDict。 此項更改是由于普通字典自 Python 3.7 起已保證具有確定的元素順序。 如果還需要 OrderedDict 的額外特性,建議的解決方案是將結(jié)果轉(zhuǎn)換為需要的類型: OrderedDict(nt._asdict())。 (由 Raymond Hettinger 在 bpo-35864 中貢獻(xiàn)。)
cProfile
cProfile.Profile 類現(xiàn)在可被用作上下文管理器。 在運(yùn)行時對一個代碼塊實現(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)在會更快速且消耗更少內(nèi)存同時仍然保留字段順序。 (由 Michael Selik 在 bpo-34003 中貢獻(xiàn)。)
curses
添加了一個新變量用于保存下層 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 依賴項,包括 DLL 的存放路徑(如果加載初始 DLL 時使用了完整或部分路徑)以及通過 add_dll_directory() 添加的路徑。 (由 Steve Dower 在 bpo-36085 中貢獻(xiàn)。)
datetime
添加了新的替代構(gòu)造器 datetime.date.fromisocalendar() 和 datetime.datetime.fromisocalendar(),它們分別基于 ISO 年份、周序號和周內(nèi)日序號來構(gòu)造 date 和 datetime 對象;這兩者分別是其所對應(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() 裝飾器,用于在實例生命周期內(nèi)緩存的已計算特征屬性。
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)在能接受一個可選的 generation 形參來指定一個用于獲取對象的生成器。 (由 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)。)
對于特定類型的無效或已損壞 gzip 文件現(xiàn)在將引發(fā) BadGzipFile 而不是 OSError。 (由 Filip Gruszczyński, Michele Orrù 和 Zackery Spytz 在 bpo-6584 中貢獻(xiàn)。)
IDLE 與 idlelib
超過 N 行(默認(rèn)值為 50)的輸出將被折疊為一個按鈕。 N 可以在 Settings 對話框的 General 頁的 PyShell 部分中進(jìn)行修改。 數(shù)量較少但是超長的行可以通過在輸出上右擊來折疊。 被折疊的輸出可通過雙擊按鈕來展開,或是通過右擊按鈕來放入剪貼板或是單獨的窗口。 (由 Tal Einat 在 bpo-1529353 中貢獻(xiàn)。)
在 Run 菜單中增加了 “Run Customized” 以使用自定義設(shè)置來運(yùn)行模塊。 輸入的任何命令行參數(shù)都會被加入 sys.argv。 它們在下次自定義運(yùn)行時會再次顯示在窗體中。 用戶也可以禁用通常的 Shell 主模塊重啟。 (由 Cheryl Sabella, Terry Jan Reedy 等人在 bpo-5680 和 bpo-37627 中貢獻(xiàn)。)
在 IDLE 編輯器窗口中增加了可選的行號。 窗口打開時默認(rèn)不顯示行號,除非在配置對話框的 General 選項卡中特別設(shè)置。 已打開窗口中的行號可以在 Options 菜單中顯示和隱藏。 (由 Tal Einat 和 Saimadhav Heblikar 在 bpo-17535 中貢獻(xiàn)。)
現(xiàn)在會使用 OS 本機(jī)編碼格式在 Python 字符串和 Tcl 對象間進(jìn)行轉(zhuǎn)換。 這允許在 IDLE 中處理 emoji 和其他非 BMP 字符。 這些字符將可被顯示或是從剪貼板復(fù)制和粘貼。 字符串從 Tcl 到 Python 的來回轉(zhuǎn)換現(xiàn)在不會再發(fā)生失敗。 (過去八年有許多人都為此付出過努力,問題最終由 Serhiy Storchaka 在 bpo-13153 中解決。)
在 3.8.1 中新增:
添加切換光標(biāo)閃爍停止的選項。 (由 Zackery Spytz 在 bpo-4603 中貢獻(xiàn)。)
Esc 鍵現(xiàn)在會關(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__ 的文檔字符串,如果該屬性是一個元素值為文檔字符串的 dict 的話。 這提供了類似于目前已有的 property(), classmethod() 和 staticmethod() 等函數(shù)的文檔選項:
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)在會在 close() 方法失敗時將異常寫入日志。 發(fā)生的異常在發(fā)布編譯版中會被靜默地忽略。 (由 Victor Stinner 在 bpo-18748 中貢獻(xiàn)。)
itertools
itertools.accumulate() 函數(shù)增加了可選的 initial 關(guān)鍵字參數(shù)用來指定一個初始值:
>>> 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
添加選項 --json-lines 用于將每個輸入行解析為單獨的 JSON 對象。 (由 Weipeng Hong 在 bpo-31553 中貢獻(xiàn)。)
logging
為 logging.basicConfig() 添加了 force 關(guān)鍵字參數(shù),當(dāng)設(shè)為真值時,關(guān)聯(lián)到根日志記錄器的任何現(xiàn)有處理程序都將在執(zhí)行由其他參數(shù)所指定的配置之前被移除并關(guān)閉。
這解決了一個長期存在的問題。 當(dāng)一個日志處理器或 basicConfig() 被調(diào)用時,對 basicConfig() 的后續(xù)調(diào)用會被靜默地忽略。 這導(dǎo)致使用交互提示符或 Jupyter 筆記本更新、試驗或講解各種日志配置選項變得相當(dāng)困難。
(由 Raymond Hettinger 提議,由 Dong-hee Na 實現(xiàn),并由 Vinay Sajip 在 bpo-33897 中完成審核。)
math
添加了新的函數(shù) math.dist() 用于計算兩點之間的歐幾里得距離。 (由 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) 乘以一個數(shù)字可迭代對象的積:
>>> prior = 0.8>>> likelihoods = [0.625, 0.84, 0.30]>>> math.prod(likelihoods, start=prior)0.126
(由 Pablo Galindo 在 bpo-35606 中貢獻(xiàn)。)
添加了兩個新的組合函數(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)。)
添加了一個新函數(shù) math.isqrt() 用于計算精確整數(shù)平方根而無需轉(zhuǎ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)在具有一個 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)使用的啟動方式是*spawn*啟動方式。 (由 Victor Stinner 在 bpo-33725 中貢獻(xiàn)。)
os
在 Windows 上添加了新函數(shù) add_dll_directory() 用于在導(dǎo)入擴(kuò)展模塊或使用 ctypes 加載 DLL 時為本機(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 上,大部分用于處理重解析點,(包括符號鏈接和目錄連接)的手動邏輯已被委托給操作系統(tǒng)。 特別地,os.stat() 現(xiàn)在將會遍歷操作系統(tǒng)所支持的任何內(nèi)容,而 os.lstat() 將只打開被標(biāo)識為“名稱代理”的重解析點,而其要由 os.stat() 打開其他的重解析點。 在所有情況下,stat_result.st_mode 將只為符號鏈接而非其他種類的重解析點設(shè)置 S_IFLNK。 要標(biāo)識其他種類的重解析點,請檢查新的 stat_result.st_reparse_tag 屬性。
在 Windows 上,os.readlink() 現(xiàn)在能夠讀取目錄連接。 請注意 islink() 會對目錄連接返回 False,因此首先檢查 islink 的代碼將連續(xù)把連接視為目錄,而會處理 os.readlink() 所引發(fā)錯誤的代碼現(xiàn)在會把連接視為鏈接。
(由 Steve Dower 在 bpo-37834 中貢獻(xiàn)。)
os.path
返回布爾值結(jié)果的 os.path 函數(shù)例如 exists(), lexists(), isdir(), isfile(), islink(), 以及 ismount() 現(xiàn)在對于包含在 OS 層級無法表示的字符或字節(jié)的路徑將會返回 False 而不是引發(fā) ValueError 或其子類 UnicodeEncodeError 和 UnicodeDecodeError。 (由 Serhiy Storchaka 在 bpo-33721 中貢獻(xiàn)。)
expanduser() 在 Windows 上現(xiàn)在改用 USERPROFILE 環(huán)境變量而不再使用 HOME,后者通常不會為一般用戶賬戶設(shè)置。 (由 Anthony Sottile 在 bpo-36264 中貢獻(xiàn)。)
isdir() 在 Windows 上將不再為不存在的目錄的鏈接返回 True。
realpath() 在 Windows 上現(xiàn)在會識別重解析點,包括符號鏈接和目錄連接。
(由 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)在對于包含在 OS 層級無法表示的字符或字節(jié)的路徑將會返回 False 而不是引發(fā) ValueError 或其子類 UnicodeEncodeError。 (由 Serhiy Storchaka 在 bpo-33721 中貢獻(xiàn)。)
添加了 pathlib.Path.link_to() 用于創(chuàng)建指向某個路徑的硬鏈接。 (由 Joannah Nanjekye 在 bpo-26978 中貢獻(xiàn)。)
pickle
pickle 擴(kuò)展子類化針對 C 優(yōu)化的 Pickler 現(xiàn)在可通過定義特殊的 reducer_override() 方法來重載函數(shù)和類的封存邏輯。 (由 Pierre Glaser 和 Olivier Grisel 在 bpo-35900 中貢獻(xiàn)。)
plistlib
添加了新的 plistlib.UID 并啟動了對讀取和寫入經(jīng)過 NSKeyedArchiver 編碼的二進(jìn)制 plists 的支持。 (由 Jon Janzen 在 bpo-26707 中貢獻(xiàn)。)
pprint
pprint 模塊為一些函數(shù)添加了 sort_dicts 形參。 默認(rèn)情況下,這些函數(shù)會繼續(xù)在渲染或打印之前對字典進(jìn)行排序。 但是,如果 sort_dicts 設(shè)為假值,則字典將保持鍵插入時的順序。 這在調(diào)試期間與 JSON 輸入進(jìn)行比較時會很有用。
除此之外,還增加了一個方便的新函數(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)在對新的歸檔默認(rèn)使用 modern pax (POSIX.1-2001) 格式以提升可移植性和標(biāo)準(zhǔn)一致性,此特性繼承自對 tarfile 模塊的相應(yīng)更改。 (由 C.A.M. Gerlach 在 bpo-30661 中貢獻(xiàn)。)
shutil.rmtree() 在 Windows 上現(xiàn)在會移除目錄連接而不會遞歸地先移除其中的內(nèi)容。 (由 Steve Dower 在 bpo-37834 中貢獻(xiàn)。)
socket
添加了便捷的 create_server() 和 has_dualstack_ipv6() 函數(shù)以自動化在創(chuàng)建服務(wù)器套接字時通常情況下所必須的任務(wù),包括在同一套接字中同時接受 IPv4 和 IPv6 連接。 (由 Giampaolo Rodolà 在 bpo-17561 中貢獻(xiàn)。)
socket.if_nameindex(), socket.if_nametoindex() 和 socket.if_indextoname() 函數(shù)已經(jīng)在 Windows 上實現(xiàn)。 (由 Zacker
網(wǎng)頁標(biāo)題:創(chuàng)新互聯(lián)Python教程:Python3.8有什么新變化
網(wǎng)站地址:http://m.5511xx.com/article/cdgpijg.html


咨詢
建站咨詢
