日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
創(chuàng)新互聯(lián)Python教程:Python3.8有什么新變化
  • 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() 兩次:

     
     
     
    1. if (n := len(a)) > 10:
    2. print(f"List is too long ({n} elements, expected <= 10)")

    類似的益處還可出現(xiàn)在正則表達(dá)式匹配中需要使用兩次匹配對(duì)象的情況中,一次檢測(cè)用于匹配是否發(fā)生,另一次用于提取子分組:

     
     
     
    1. discount = 0.0
    2. if (mo := re.search(r'(\d+)% discount', advertisement)):
    3. discount = float(mo.group(1)) / 100.0

    此運(yùn)算符也適用于配合 while 循環(huán)計(jì)算一個(gè)值來檢測(cè)循環(huán)是否終止,而同一個(gè)值又在循環(huán)體中再次被使用的情況:

     
     
     
    1. # Loop over fixed length blocks
    2. while (block := f.read(256)) != '':
    3. process(block)

    另一個(gè)值得介紹的用例出現(xiàn)于列表推導(dǎo)式中,在篩選條件中計(jì)算一個(gè)值,而同一個(gè)值又在表達(dá)式中需要被使用:

     
     
     
    1. [clean_name.title() for name in names
    2. if (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.

    在下面的例子中,形參 ab 為僅限位置形參,cd 可以是位置形參或關(guān)鍵字形參,而 ef 要求為關(guān)鍵字形參:

     
     
     
    1. def f(a, b, /, c, d, *, e, f):
    2. print(a, b, c, d, e, f)

    以下均為合法的調(diào)用:

     
     
     
    1. f(10, 20, 30, d=40, e=50, f=60)

    但是,以下均為不合法的調(diào)用:

     
     
     
    1. f(10, b=20, c=30, d=40, e=50, f=60) # b cannot be a keyword argument
    2. f(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ù):

     
     
     
    1. def divmod(a, b, /):
    2. "Emulate the built in divmod() function"
    3. return (a // b, a % b)

    另一個(gè)用例是在不需要形參名稱時(shí)排除關(guān)鍵字參數(shù)。 例如,內(nèi)置的 len() 函數(shù)的簽名為 len(obj, /)。 這可以排除如下這種笨拙的調(diào)用形式:

     
     
     
    1. len(obj='hello') # The "obj" keyword argument impairs readability

    另一個(gè)益處是將形參標(biāo)記為僅限位置形參將允許在未來修改形參名而不會(huì)破壞客戶的代碼。 例如,在 statistics 模塊中,形參名 dist 在未來可能被修改。 這使得以下函數(shù)描述成為可能:

     
     
     
    1. def quantiles(dist, /, *, n=4, method='exclusive')
    2. ...

    由于在 / 左側(cè)的形參不會(huì)被公開為可用關(guān)鍵字,其他形參名仍可在 **kwargs 中使用:

     
     
     
    1. >>> def f(a, b, /, **kwargs):
    2. ... print(a, b, kwargs)
    3. ...
    4. >>> f(10, 20, a=1, b=2, c=3) # a and b are used in two ways
    5. 10 20 {'a': 1, 'b': 2, 'c': 3}

    這極大地簡(jiǎn)化了需要接受任意關(guān)鍵字參數(shù)的函數(shù)和方法的實(shí)現(xiàn)。 例如,以下是一段摘自 collections 模塊的代碼:

     
     
     
    1. class Counter(dict):
    2. def __init__(self, iterable=None, /, **kwds):
    3. # 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é)果。 例如:

     
     
     
    1. >>> user = 'eric_idle'
    2. >>> member_since = date(1975, 7, 31)
    3. >>> f'{user=} {member_since=}'
    4. "user='eric_idle' member_since=datetime.date(1975, 7, 31)"

    通常的 f-字符串格式說明符 允許更細(xì)致地控制所要顯示的表達(dá)式結(jié)果:

     
     
     
    1. >>> delta = date.today() - member_since
    2. >>> f'{user=!s} {delta.days=:,d}'
    3. 'user=eric_idle delta.days=16,075'

    = 說明符將輸出整個(gè)表達(dá)式,以便詳細(xì)演示計(jì)算過程:

     
     
     
    1. >>> print(f'{theta=} {cos(radians(theta))=:.3f}')
    2. 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á)式 中的支持:

         
         
         
      1. >>> notice = 'Copyright ? 2019'
      2. >>> copyright_year_pattern = re.compile(r'\N{copyright sign}\s*(\d{4})')
      3. >>> int(copyright_year_pattern.search(notice).group(1))
      4. 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)。 這使得 yieldreturn 的語法與正常的賦值語法更為一致:

         
         
         
      1. >>> def parse(family):
      2. lastname, *members = family.split()
      3. return lastname.upper(), *members
      4. >>> parse('simpsons homer marge bart lisa maggie')
      5. ('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ù)的例子:

         
         
         
      1. >>> from statistics import mean
      2. >>> mean(data=[10, 20, 90])
      3. 40
      4. >>> mean.__code__ = mean.__code__.replace(co_posonlyargcount=1)
      5. >>> mean(data=[10, 20, 90])
      6. Traceback (most recent call last):
      7. ...
      8. 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 的 模乘逆元 則可寫為:

         
         
         
      1. >>> pow(38, -1, 137)
      2. 119
      3. >>> 119 * 38 % 137
      4. 1

      模乘逆元在求解 線性丟番圖方程 會(huì)被用到。 例如,想要求出 4258???? + 147???? = 369 的整數(shù)解,首先應(yīng)重寫為 4258???? ≡ 369 (mod 147) 然后求解:

         
         
         
      1. >>> x = 369 * pow(4258, -1, 147) % 147
      2. >>> y = (4258 * x - 369) // -147
      3. >>> 4258 * x + 147 * y
      4. 369

      (由 Mark Dickinson 在 bpo-36027 中貢獻(xiàn)。)

    • 字典推導(dǎo)式已與字典字面值實(shí)現(xiàn)同步,會(huì)先計(jì)算鍵再計(jì)算值:

         
         
         
      1. >>> # Dict comprehension
      2. >>> cast = {input('role? '): input('actor? ') for i in range(2)}
      3. role? King Arthur
      4. actor? Chapman
      5. role? Black Knight
      6. actor? Cleese
      7. >>> # Dict literal
      8. >>> cast = {input('role? '): input('actor? ')}
      9. role? Sir Robin
      10. actor? Eric Idle

      對(duì)執(zhí)行順序的保證對(duì)賦值表達(dá)式來說很有用,因?yàn)樵阪I表達(dá)式中賦值的變量將可在值表達(dá)式中被使用:

         
         
         
      1. >>> names = ['Martin von L?wis', '?ukasz Langa', 'Walter D?rwald']
      2. >>> {(n := normalize('NFC', name)).casefold() : n for name in names}
      3. {'martin von l?wis': 'Martin von L?wis',
      4. '?ukasz langa': '?ukasz Langa',
      5. '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)列表等等:

         
         
         
      1. >>> # Note following example requires that the popular "requests"
      2. >>> # package has been installed.
      3. >>>
      4. >>> from importlib.metadata import version, requires, files
      5. >>> version('requests')
      6. '2.22.0'
      7. >>> list(requires('requests'))
      8. ['chardet (<3.1.0,>=3.0.2)']
      9. >>> list(files('requests'))[:5]
      10. [PackagePath('requests-2.22.0.dist-info/INSTALLER'),
      11. PackagePath('requests-2.22.0.dist-info/LICENSE'),
      12. PackagePath('requests-2.22.0.dist-info/METADATA'),
      13. PackagePath('requests-2.22.0.dist-info/RECORD'),
      14. 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_linenoend_col_offset 屬性,它們給出節(jié)點(diǎn)結(jié)束的精確位置。 (這只適用于具有 linenocol_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)。 例如:

     
     
     
    1. import asyncio
    2. async def main():
    3. await asyncio.sleep(0)
    4. return 42
    5. asyncio.run(main())

    大致 等價(jià)于:

     
     
     
    1. import asyncio
    2. async def main():
    3. await asyncio.sleep(0)
    4. return 42
    5. loop = asyncio.new_event_loop()
    6. asyncio.set_event_loop(loop)
    7. try:
    8. loop.run_until_complete(main())
    9. finally:
    10. asyncio.set_event_loop(None)
    11. 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):

     
     
     
    1. $ python -m asyncio
    2. asyncio REPL 3.8.0
    3. Use "await" directly instead of "asyncio.run()".
    4. Type "help", "copyright", "credits" or "license" for more information.
    5. >>> import asyncio
    6. >>> await asyncio.sleep(10, result='hello')
    7. 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_delayinterleave。 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 forasync 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)性能分析:

     
     
     
    1. import cProfile
    2. with cProfile.Profile() as profiler:
    3. # code to be profiled
    4. ...

    (由 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)在都被支持:

     
     
     
    1. @lru_cache
    2. def f(x):
    3. ...
    4. @lru_cache(maxsize=256)
    5. def f(x):
    6. ...

    (由 Raymond Hettinger 在 bpo-36772 中貢獻(xiàn)。)

    添加了新的 functools.cached_property() 裝飾器,用于在實(shí)例生命周期內(nèi)緩存的已計(jì)算特征屬性。

     
     
     
    1. import functools
    2. import statistics
    3. class Dataset:
    4. def __init__(self, sequence_of_numbers):
    5. self.data = sequence_of_numbers
    6. @functools.cached_property
    7. def variance(self):
    8. return statistics.variance(self.data)

    (由 Carl Meyer 在 bpo-21145 中貢獻(xiàn))

    添加了新的 functools.singledispatchmethod() 裝飾器可使用 single dispatch 將方法轉(zhuǎn)換為 泛型函數(shù):

     
     
     
    1. from functools import singledispatchmethod
    2. from contextlib import suppress
    3. class TaskManager:
    4. def __init__(self, tasks):
    5. self.tasks = list(tasks)
    6. @singledispatchmethod
    7. def discard(self, value):
    8. with suppress(ValueError):
    9. self.tasks.remove(value)
    10. @discard.register(list)
    11. def _(self, tasks):
    12. targets = set(tasks)
    13. 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):

     
     
     
    1. class AudioClip:
    2. __slots__ = {'bit_rate': 'expressed in kilohertz to one decimal place',
    3. 'duration': 'in seconds, rounded up to an integer'}
    4. def __init__(self, bit_rate, duration):
    5. self.bit_rate = round(bit_rate / 1000.0, 1)
    6. 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è)初始值:

     
     
     
    1. >>> from itertools import accumulate
    2. >>> list(accumulate([10, 5, 30, 15], initial=1000))
    3. [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ì)象的積:

     
     
     
    1. >>> prior = 0.8
    2. >>> likelihoods = [0.625, 0.84, 0.30]
    3. >>> math.prod(likelihoods, start=prior)
    4. 0.126

    (由 Pablo Galindo 在 bpo-35606 中貢獻(xiàn)。)

    添加了兩個(gè)新的組合函數(shù) math.perm() 和 math.comb():

     
     
     
    1. >>> math.perm(10, 3) # Permutations of 10 things taken 3 at a time
    2. 720
    3. >>> math.comb(10, 3) # Combinations of 10 things taken 3 at a time
    4. 120

    (由 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() 慢:

     
     
     
    1. >>> r = 650320427
    2. >>> s = r ** 2
    3. >>> isqrt(s - 1) # correct
    4. 650320426
    5. >>> floor(sqrt(s - 1)) # incorrect
    6. 650320427

    (由 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:

     
     
     
    1. >>> from pprint import pprint, pp
    2. >>> d = dict(source='input.txt', operation='filter', destination='output.txt')
    3. >>> pp(d, width=40) # Original order
    4. {'source': 'input.txt',
    5. 'operation': 'filter',
    6. 'destination': 'output.txt'}
    7. >>> pprint(d, width=40) # Keys sorted alphabetically
    8. {'destination': 'output.txt',
    9. 'operation': 'filter',
    10. '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