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

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
創(chuàng)新互聯(lián)Python教程:Python3.9有什么新變化
  • python 3.9 有什么新變化
    • 摘要 — 發(fā)布重點(diǎn)
    • 請(qǐng)檢查代碼中的 DeprecationWarning。
    • 新的特性
      • 字典合并與更新運(yùn)算符
      • 新增用于移除前綴和后綴的字符串方法
      • 標(biāo)準(zhǔn)多項(xiàng)集中的類(lèi)型標(biāo)注泛型
      • 新的解析器
    • 其他語(yǔ)言特性修改
    • 新增模塊
      • zoneinfo
      • graphlib
    • 改進(jìn)的模塊
      • ast
      • asyncio
      • compileall
      • concurrent.futures
      • curses
      • datetime
      • distutils
      • fcntl
      • ftplib
      • gc
      • hashlib
      • http
      • IDLE 與 idlelib
      • imaplib
      • importlib
      • inspect
      • ipaddress
      • math
      • multiprocessing
      • nntplib
      • os
      • pathlib
      • pdb
      • poplib
      • pprint
      • pydoc
      • random
      • signal
      • smtplib
      • socket
      • time
      • sys
      • tracemalloc
      • typing
      • unicodedata
      • venv
      • xml
    • 性能優(yōu)化
    • 棄用
    • 移除
    • 移植到 Python 3.9
      • Python API 的變化
      • C API 的變化
      • CPython 字節(jié)碼的改變
    • 構(gòu)建的改變
    • C API 的改變
      • 新的特性
      • 移植到 Python 3.9
      • 移除
    • Python 3.9.1 中的重要變化
      • typing
      • macOS 11.0 (Big Sur) 與 Apple Silicon Mac 支持
    • Python 3.9.2 中的重要變化
      • collections.abc
      • urllib.parse

    Python 3.9 有什么新變化

    發(fā)布版本

    3.11.0

    日期

    十一月 10, 2022

    編者

    ?ukasz Langa

    本文介紹了 Python 3.9 相比 3.8 的新特性。 Python 3.9 發(fā)布于 2020 年 10 月 5 日。

    詳情請(qǐng)參閱 更新日志。

    參見(jiàn)

    PEP 596 - Python 3.9 發(fā)布計(jì)劃

    摘要 — 發(fā)布重點(diǎn)

    新的語(yǔ)法特性:

    • PEP 584,為 dict 增加合并運(yùn)算符;

    • PEP 585,標(biāo)準(zhǔn)多項(xiàng)集中的類(lèi)型標(biāo)注泛型。

    • PEP 614,放寬對(duì)裝飾器的語(yǔ)法限制。

    新的內(nèi)置特性:

    • PEP 616,移除前綴和后綴的字符串方法。

    標(biāo)準(zhǔn)庫(kù)中的新特性:

    • PEP 593,靈活函數(shù)和變量注解;

    • 添加了 os.pidfd_open() 以允許不帶競(jìng)爭(zhēng)和信號(hào)的進(jìn)程管理。

    解釋器的改進(jìn):

    • PEP 573,從 C 擴(kuò)展類(lèi)型的方法快速訪問(wèn)模塊狀態(tài);

    • PEP 617,CPython 現(xiàn)在使用基于 PEG 的新解析器;

    • 一些 Python 內(nèi)置類(lèi)型(range、tuple、set、frozenset、list、dict)現(xiàn)已使用 PEP 590 vectorcall 加速;

    • 垃圾回收不會(huì)因恢復(fù)的對(duì)象而阻塞;

    • 一些 Python 模塊(_abc、audioop、_bz2、_codecs、_contextvars_crypt、_functools_json、_locale、math、operator、resource、time、_weakref)現(xiàn)已使用 PEP 489 中定義的多段初始化;

    • 一些標(biāo)準(zhǔn)庫(kù)模塊 (audioop、ast、grp、_hashlib、pwd、_posixsubprocess、random、select、struct、termios、zlib) 現(xiàn)已使用 PEP 384 中定義的穩(wěn)定 ABI。

    新的庫(kù)模塊:

    • PEP 615,標(biāo)準(zhǔn)庫(kù)的 zoneinfo 模塊現(xiàn)已支持 IANA 時(shí)區(qū)數(shù)據(jù)庫(kù);

    • 圖的拓?fù)渑判驅(qū)崿F(xiàn)現(xiàn)在已由新的 graphlib 模塊提供。

    發(fā)布進(jìn)程的變化:

    • PEP 602,CPython 采用年度發(fā)布周期。

    請(qǐng)檢查代碼中的 DeprecationWarning。

    Python 2.7 支持未終止時(shí),為了實(shí)現(xiàn)向下兼容 Python 2.7,Python 3 保留了許多舊版功能。Python 2 的支持終止后,已經(jīng)移除了一部分向下兼容層,剩余部分很快也會(huì)被移除。這幾年,大部分兼容層都會(huì)觸發(fā) DeprecationWarning 警告。例如,2012 年發(fā)布 Python 3.3 后,用 collections.Mapping 替代 collections.abc.Mapping 就會(huì)觸發(fā) DeprecationWarning。

    請(qǐng)用 -W default 命令行選項(xiàng)測(cè)試應(yīng)用程序來(lái)查看 DeprecationWarning 和 PendingDeprecationWarning,甚至可以用 -W error 將它們視為錯(cuò)誤。 可以用 警告過(guò)濾器 忽略來(lái)自第三方代碼的警告。

    Python 3.9 是最后一個(gè)提供 Python 2 向下兼容層的版本,以給予 Python 項(xiàng)目維護(hù)者更多時(shí)間移除 Python 2 支持,添加 Python 3.9 支持。

    collections 模塊中 抽象基類(lèi) 的別名,例如 collections.abc.Mapping 的別名 collections.Mapping 會(huì)為向下兼容最后保留一個(gè)發(fā)行版。 這些內(nèi)容將在 Python 3.10 中移除。

    更通俗的說(shuō)法是,請(qǐng)?jiān)?Python 開(kāi)發(fā)模式 下運(yùn)行測(cè)試,這樣做有助于讓代碼兼容 Python 的后續(xù)版本。

    注:一些前期已棄用的內(nèi)容也將在此 Python 版本中移除。 詳見(jiàn) 移除 一節(jié)。

    新的特性

    字典合并與更新運(yùn)算符

    合并 (|) 與更新 (|=) 運(yùn)算符已被加入內(nèi)置的 dict 類(lèi)。 它們?yōu)楝F(xiàn)有的 dict.update{**d1, **d2} 字典合并方法提供了補(bǔ)充。

    示例:

     
     
     
    1. >>> x = {"key1": "value1 from x", "key2": "value2 from x"}
    2. >>> y = {"key2": "value2 from y", "key3": "value3 from y"}
    3. >>> x | y
    4. {'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}
    5. >>> y | x
    6. {'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}

    詳見(jiàn) PEP 584。(Brandt Bucher 在 bpo-36144 中的貢獻(xiàn)。)

    新增用于移除前綴和后綴的字符串方法

    增加了 str.removeprefix(prefix) 和 str.removesuffix(suffix) 用于方便地從字符串移除不需要的前綴或后綴。 也增加了 bytes, bytearray 以及 collections.UserString 的對(duì)應(yīng)方法。 請(qǐng)參閱 PEP 616 了解詳情。 (由 Dennis Sweeney 在 bpo-39939 中貢獻(xiàn)。)

    標(biāo)準(zhǔn)多項(xiàng)集中的類(lèi)型標(biāo)注泛型

    在類(lèi)型標(biāo)注中現(xiàn)在你可以使用內(nèi)置多項(xiàng)集類(lèi)型例如 listdict 作為通用類(lèi)型而不必從 typing 導(dǎo)入對(duì)應(yīng)的大寫(xiě)形式類(lèi)型名 (例如 ListDict)。 標(biāo)準(zhǔn)庫(kù)中的其他一些類(lèi)型現(xiàn)在同樣也是通用的,例如 queue.Queue。

    示例:

     
     
     
    1. def greet_all(names: list[str]) -> None:
    2. for name in names:
    3. print("Hello", name)

    詳見(jiàn) PEP 585。(由 Guido van Rossum、Ethan Smith 和 Batuhan Ta?kaya 在 bpo-39481 中貢獻(xiàn)。)

    新的解析器

    Python 3.9 使用于基于 PEG 的新解析器替代 LL(1)。 新解析器的性能與舊解析器大致相當(dāng),但 PEG 在設(shè)計(jì)新語(yǔ)言特性時(shí)的形式化比 LL(1) 更靈活。 我們將在 Python 3.10 及之后版本中開(kāi)始使用這種靈活性。

    ast 模塊會(huì)使用新解析器并會(huì)生成與舊解析器一致的 AST。

    在 Python 3.10 中,舊解析器將被移除,依賴(lài)于它的所有功能也將被移除(主要是 parser 模塊,它早已被棄用)。 只有 在 Python 3.9 中,你可以使用命令行開(kāi)關(guān) (-X oldparser) 或環(huán)境變量 (PYTHONOLDPARSER=1) 切換回 LL(1) 解析器。

    請(qǐng)參閱 PEP 617 了解詳情。 (由 Guido van Rossum, Pablo Galindo 和 Lysandros Nikolaou 在 bpo-40334 中貢獻(xiàn)。)

    其他語(yǔ)言特性修改

    • __import__() 現(xiàn)在會(huì)引發(fā) ImportError 而不是 ValueError,后者曾經(jīng)會(huì)在相對(duì)導(dǎo)入超出其最高層級(jí)包時(shí)發(fā)生。 (由 Ngalim Siregar 在 bpo-37444 中貢獻(xiàn)。)

    • Python 現(xiàn)在會(huì)獲取命令行中指定的腳本文件名 (例如: Python3 script.py) 的絕對(duì)路徑: __main__ 模塊的 __file__ 屬性將是一個(gè)絕對(duì)路徑,而不是相對(duì)路徑。 現(xiàn)在此路徑在當(dāng)前目錄通過(guò) os.chdir() 被改變后仍將保持有效。 作為附帶效果,回溯信息也將在此情況下為 __main__ 模塊幀顯示絕對(duì)路徑。 (由 Victor Stinner 在 bpo-20443 中貢獻(xiàn)。)

    • 在 Python 開(kāi)發(fā)模式 以及 調(diào)試編譯版本 中,現(xiàn)在會(huì)針對(duì)字符串編碼和解碼操作檢查 encodingerrors 參數(shù)。 例如: open(), str.encode() 和 bytes.decode()。

      默認(rèn)設(shè)置下,為保證性能,errors 參數(shù)只會(huì)在第一次發(fā)生編碼/解碼錯(cuò)誤時(shí)被檢查,并且對(duì)于空字符串 encoding 參數(shù)有時(shí)會(huì)被忽略。 (由 Victor Stinner 在 bpo-37388 中貢獻(xiàn)。)

    • "".replace("", s, n) 對(duì)于所有非零的 n 都將返回 s 而不是空字符串。 現(xiàn)在此方法會(huì)與 "".replace("", s) 保持一致。 對(duì)于 bytes 和 bytearray 對(duì)象也有類(lèi)似的修改。 (由 Serhiy Storchaka 在 bpo-28029 中貢獻(xiàn)。)

    • 任何有效的表達(dá)式現(xiàn)在都可被用作 decorator。 在之前版本中,相關(guān)語(yǔ)法則更為嚴(yán)格。 請(qǐng)參閱 PEP 614 了解詳情。 (由 Brandt Bucher 在 bpo-39702 中貢獻(xiàn)。)

    • 改進(jìn)了 typing 模塊的幫助信息。 現(xiàn)在將為所有特殊形式和特殊通用別名 (例如 UnionList) 顯示文檔字符串。 使用 help() 時(shí)傳入通用別名例如 List[int] 將顯示對(duì)應(yīng)實(shí)體類(lèi)型 (這里對(duì)應(yīng)的是 list) 的幫助信息。 (由 Serhiy Storchaka 在 bpo-40257 中貢獻(xiàn)。)

    • aclose() / asend() / athrow() 的并行運(yùn)行現(xiàn)在已被禁止,且 ag_running 現(xiàn)在會(huì)反映異步生成器的實(shí)際運(yùn)行狀態(tài)。 (由 Yury Selivanov 在 bpo-30773 中貢獻(xiàn)。)

    • 調(diào)用 __iter__ 方法時(shí)發(fā)生的非預(yù)期錯(cuò)誤不會(huì)再被 in 運(yùn)算符以及 operator 的 contains(), indexOf() 和 countOf() 中的 TypeError 所掩蓋。 (由 Serhiy Storchaka 在 bpo-40824 中貢獻(xiàn)。)

    • 未加圓括號(hào)的 lambda 表達(dá)式不能再作為推導(dǎo)式和生成器表達(dá)式的 if 子句的表達(dá)式部分。 請(qǐng)參閱 bpo-41848 和 bpo-43755 了解詳情。

    新增模塊

    zoneinfo

    zoneinfo 模塊為標(biāo)準(zhǔn)庫(kù)引入了 IANA 時(shí)區(qū)數(shù)據(jù)庫(kù)。 它添加了 zoneinfo.ZoneInfo,這是一個(gè)基于系統(tǒng)時(shí)區(qū)數(shù)據(jù)的實(shí)體 datetime.tzinfo 實(shí)現(xiàn)。

    示例:

     
     
     
    1. >>> from zoneinfo import ZoneInfo
    2. >>> from datetime import datetime, timedelta
    3. >>> # Daylight saving time
    4. >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
    5. >>> print(dt)
    6. 2020-10-31 12:00:00-07:00
    7. >>> dt.tzname()
    8. 'PDT'
    9. >>> # Standard time
    10. >>> dt += timedelta(days=7)
    11. >>> print(dt)
    12. 2020-11-07 12:00:00-08:00
    13. >>> print(dt.tzname())
    14. PST

    作為不包含 IANA 數(shù)據(jù)庫(kù)的平臺(tái)的一個(gè)回退數(shù)據(jù)源,還以第一方軟件包的形式發(fā)布了 tzdata 模塊 — 通過(guò) PyPI 發(fā)行并由 CPython 核心團(tuán)隊(duì)維護(hù)。

    參見(jiàn)

    PEP 615 — 在標(biāo)準(zhǔn)庫(kù)中支持 IANA 時(shí)區(qū)數(shù)據(jù)庫(kù)

    PEP 由 Paul Ganssle 撰寫(xiě)并實(shí)現(xiàn)

    graphlib

    添加了新的 graphlib 模塊,其中包含 graphlib.TopologicalSorter 類(lèi)來(lái)提供圖的拓?fù)渑判蚬δ堋?(由 Pablo Galindo, Tim Peters 和 Larry Hastings 在 bpo-17005 中貢獻(xiàn)。)

    改進(jìn)的模塊

    ast

    indent 選項(xiàng)添加到 dump(),這允許它產(chǎn)生多行縮進(jìn)的輸出。 (由 Serhiy Storchaka 在 bpo-37995 中貢獻(xiàn)。)

    添加了 ast.unparse() 作為 ast 模塊中的一個(gè)函數(shù),它可被用來(lái)反解析 ast.AST 對(duì)象并產(chǎn)生相應(yīng)的代碼字符串,當(dāng)它被解析時(shí)將會(huì)產(chǎn)生一個(gè)等價(jià)的 ast.AST 對(duì)象。 (由 Pablo Galindo 和 Batuhan Taskaya 在 bpo-38870 中貢獻(xiàn)。)

    為 AST 節(jié)點(diǎn)添加了文檔字符串,其中包含 ASDL 簽名,可被用來(lái)構(gòu)造對(duì)應(yīng)的節(jié)點(diǎn)。 (由 Batuhan Taskaya 在 bpo-39638 中貢獻(xiàn)。)

    asyncio

    出于重要的安全性考量,asyncio.loop.create_datagram_endpoint() 的 reuse_address 形參不再被支持。 這是由 UDP 中的套接字選項(xiàng) SO_REUSEADDR 的行為導(dǎo)致的。 更多細(xì)節(jié)請(qǐng)參閱 loop.create_datagram_endpoint() 的文檔。 (由 Kyle Stanley, Antoine Pitrou 和 Yury Selivanov 在 bpo-37228 中貢獻(xiàn)。。)

    添加了新的 coroutine shutdown_default_executor(),它可為等待 ThreadPoolExecutor 結(jié)束關(guān)閉的默認(rèn)執(zhí)行器安排關(guān)閉日程操作。 此外,asyncio.run() 已被更新以使用新的 coroutine。 (由 Kyle Stanley 在 bpo-34037 中貢獻(xiàn)。)

    添加了 asyncio.PidfdChildWatcher,這是一個(gè) Linux 專(zhuān)屬的子監(jiān)視器實(shí)現(xiàn),它負(fù)責(zé)輪詢(xún)進(jìn)程的文件描述符。 (bpo-38692)

    添加了新的 coroutine asyncio.to_thread()。 它主要被用于在單獨(dú)線(xiàn)程中運(yùn)行 IO 密集型函數(shù)以避免阻塞事件循環(huán),實(shí)質(zhì)上就相當(dāng)于是 run_in_executor() 的高層級(jí)版本,可直接接受關(guān)鍵字參數(shù)。 (由 Kyle Stanley 和 Yury Selivanov 在 bpo-32309 中貢獻(xiàn)。)

    當(dāng)由于超時(shí)而取消任務(wù)時(shí),asyncio.wait_for() 現(xiàn)在將會(huì)等待直到也在 timeout 值 <= 0 的情況下完成取消。 就像 timeout 值為正數(shù)時(shí)一樣。 (由 Elvis Pranskevichus 在 bpo-32751 中貢獻(xiàn)。)

    當(dāng)附帶 ssl.SSLSocket 套接字調(diào)用不兼容的方法時(shí) asyncio 現(xiàn)在會(huì)引發(fā) TyperError。 (由 Ido Michael 在 bpo-37404 中貢獻(xiàn)。)

    compileall

    為重復(fù)的 .pyc 文件添加了使用硬軟件的可能性: hardlink_dupes 形參以及 —hardlink-dupes 命令行選項(xiàng)。 (由 Lumír ‘Frenzy’ Balhar 在 bpo-40495 中貢獻(xiàn)。)

    新增了一些用于在結(jié)果 .pyc 文件中操縱路徑的選項(xiàng): stripdir, prependdir, limit_sl_dest 形參以及 -s, -p, -e 命令行選項(xiàng)。 并使得為優(yōu)化等級(jí)多次指定選項(xiàng)成為可能。 (由 Lumír ‘Frenzy’ Balhar 在 bpo-38112 中貢獻(xiàn)。)

    concurrent.futures

    將新的 cancel_futures 形參添加到 concurrent.futures.Executor.shutdown(),可以取消尚未開(kāi)始運(yùn)行的所有掛起的 Future,而不必等待它們完成運(yùn)行再關(guān)閉執(zhí)行器。 (由 Kyle Stanley 在 bpo-39349 中貢獻(xiàn)。)

    從 ThreadPoolExecutor 和 ProcessPoolExecutor 中移除了守護(hù)線(xiàn)程。 這改善與與子解釋器的兼容性及它們?cè)陉P(guān)閉進(jìn)程時(shí)的可預(yù)測(cè)性。 (由 Kyle Stanley 在 bpo-39812 中貢獻(xiàn)。)

    現(xiàn)在 ProcessPoolExecutor 中的工作進(jìn)程僅會(huì)在沒(méi)有可重用的空閑工作進(jìn)程時(shí)按需產(chǎn)生。 這優(yōu)化了啟動(dòng)開(kāi)銷(xiāo)并減少了由空閑工作進(jìn)程導(dǎo)致的 CPU 時(shí)間損失。 (由 Kyle Stanley 在 bpo-39207 中貢獻(xiàn)。)

    curses

    增加了 curses.get_escdelay(), curses.set_escdelay(), curses.get_tabsize() 以及 curses.set_tabsize() 函數(shù)。(由 Anthony Sottile 在 bpo-38312 中貢獻(xiàn)。)

    datetime

    datetime.date 的 isocalendar() 以及 datetime.datetime 的 isocalendar() 等方法現(xiàn)在將返回 namedtuple() 而不是 tuple。 (由 Dong-hee Na 在 bpo-24416 中貢獻(xiàn)。)

    distutils

    upload 命令現(xiàn)在會(huì)創(chuàng)建 SHA2-256 和 Blake2b-256 哈希摘要。 它會(huì)在禁用 MD5 摘要的平臺(tái)上跳過(guò) MD5。 (由 Christian Heimes 在 bpo-40698 中貢獻(xiàn)。)

    fcntl

    增加了 F_OFD_GETLK, F_OFD_SETLKF_OFD_SETLKW 等常量。 (由 Dong-hee Na 在 bpo-38602 中貢獻(xiàn)。)

    ftplib

    現(xiàn)在 FTP 和 FTP_TLS 當(dāng)它們的構(gòu)造器所給定的超時(shí)參數(shù)為零以防止創(chuàng)建非阻塞套接字時(shí)會(huì)引發(fā) ValueError。 (由 Dong-hee Na 在 bpo-39259 中貢獻(xiàn)。)

    gc

    當(dāng)垃圾回收器進(jìn)行某些復(fù)活對(duì)象的收集時(shí)(在終結(jié)器被執(zhí)行之后這些對(duì)象可以在隔離周期之外被訪問(wèn)),不會(huì)阻止對(duì)所有仍然無(wú)法訪問(wèn)的對(duì)象的收集。 (由 Pablo Galindo 和 Tim Peters 在 bpo-38379 中貢獻(xiàn)。)

    增加了一個(gè)新的函數(shù) gc.is_finalized() 用來(lái)檢測(cè)一個(gè)對(duì)象是否已被垃圾回收器所終結(jié)。 (由 Pablo Galindo 在 bpo-39322 中貢獻(xiàn)。)

    hashlib

    hashlib 模塊現(xiàn)在會(huì)在可能的情況下使用 OpenSSL 中的 SHA3 哈希和 SHAKE XOF。 (由 Christian Heimes 在 bpo-37630 中貢獻(xiàn)。)

    內(nèi)置的哈希模塊現(xiàn)在可通過(guò) ./configure --without-builtin-hashlib-hashes 禁用或通過(guò) ./configure --with-builtin-hashlib-hashes=sha3,blake2 這樣的形式有選擇地啟用以強(qiáng)制使用基于 OpenSSL 的實(shí)現(xiàn)。 (由 Christian Heimes 在 bpo-40479 中貢獻(xiàn))

    http

    添加 HTTP 狀態(tài)碼 103 EARLY_HINTS, 418 IM_A_TEAPOT425 TOO_EARLY 到 http.HTTPStatus。 (由 Dong-hee Na 在 bpo-39509 以及 Ross Rhodes 在 bpo-39507 中貢獻(xiàn)。)

    IDLE 與 idlelib

    添加了切換光標(biāo)閃爍停止的選項(xiàng)。 (由 Zackery Spytz 在 bpo-4603 中貢獻(xiàn)。)

    Esc 鍵現(xiàn)在會(huì)關(guān)閉 IDLE 補(bǔ)全提示窗口。 (由 Johnny Najera 在 bpo-38944 中貢獻(xiàn)。)

    添加關(guān)鍵字到模塊名稱(chēng)補(bǔ)全列表。 (由 Terry J. Reedy 在 bpo-37765 中貢獻(xiàn)。)

    3.9 維護(hù)版本中的新內(nèi)容

    使 IDLE 調(diào)用 sys.excepthook() (當(dāng)啟動(dòng)時(shí)沒(méi)有 ‘-n’ )。用戶(hù)鉤子以前是被忽略的。 (由 Ken Hilton 在 bpo-43008 中貢獻(xiàn)。)

    上述修改已被反向移植到 3.8 維護(hù)發(fā)行版中。

    重新安排設(shè)置對(duì)話(huà)框。 將常規(guī)選項(xiàng)卡分成 Windows 和 Shell/Ed 選項(xiàng)卡。 將擴(kuò)展幫助菜單的幫助源移至擴(kuò)展標(biāo)簽。為新選項(xiàng)留出空間,并縮短對(duì)話(huà)框。后者使對(duì)話(huà)框更適合小屏幕。 (由 Terry Jan Reedy 貢獻(xiàn)于 bpo-40468 。) 將縮進(jìn)空間設(shè)置從字體標(biāo)簽移到新的 Windows 標(biāo)簽。 (由 Mark Roseman 和 Terry Jan Reedy 在 bpo-33962 中提供)。

    Apply syntax highlighting to .pyi files. (Contributed by Alex Waygood and Terry Jan Reedy in bpo-45447.)

    imaplib

    現(xiàn)在 IMAP4 和 IMAP4_SSL 的構(gòu)造器具有可選的 timeout 形參。 并且,現(xiàn)在 open() 方法也具有可選的 timeout 形參提供同樣的修改。 IMAP4_SSL 和 IMAP4_stream 中被重載的方法也應(yīng)用了這個(gè)修改。 (由 Dong-hee Na 在 bpo-38615 中貢獻(xiàn)。)

    增加了 imaplib.IMAP4.unselect()。 imaplib.IMAP4.unselect() 會(huì)釋放關(guān)聯(lián)到選定郵箱的服務(wù)器資源并將服務(wù)器返回到已認(rèn)證狀態(tài)。 此命令會(huì)執(zhí)行與 imaplib.IMAP4.close() 相同的動(dòng)作,區(qū)別在于它不會(huì)從當(dāng)前選定郵箱中永久性地移除消息。 (由 Dong-hee Na 在 bpo-40375 中貢獻(xiàn)。)

    importlib

    為提升與 import 語(yǔ)句的一致性,現(xiàn)在 importlib.util.resolve_name() 對(duì)于無(wú)效的相對(duì)導(dǎo)入嘗試會(huì)引發(fā) ImportError 而不是 ValueError。 (由 Ngalim Siregar 在 bpo-37444 中貢獻(xiàn)。)

    發(fā)布不可變模塊對(duì)象的導(dǎo)入加載器除了發(fā)布單獨(dú)模塊以外現(xiàn)在也可以發(fā)布不可變包。 (由 Dino Viehland 在 bpo-39336 中貢獻(xiàn)。)

    添加了帶有對(duì)包數(shù)據(jù)中子目錄支持的 importlib.resources.files() 函數(shù),與 importlib_resources 1.5 版的反向端口相匹配。(由 Jason R. Coombs 在 bpo-39791 中貢獻(xiàn)。)

    來(lái)自 importlib_metadata 1.6.1 版的已更新 importlib.metadata。

    inspect

    inspect.BoundArguments.arguments 已從 OrderedDict 改為常規(guī)字典。 (由 Inada Naoki 在 bpo-36350 和 bpo-39775 中貢獻(xiàn)。)

    ipaddress

    ipaddress 現(xiàn)在支持 IPv6 作用域地址(即帶有 % 前綴的 IPv6 地址)。

    IPv6 作用域地址可使用 ipaddress.IPv6Address 來(lái)解析。 作用域的區(qū) ID 如果存在,可通過(guò) scope_id 屬性來(lái)獲取。 (由 Oleksandr Pavliuk 在 bpo-34788 中貢獻(xiàn)。)

    從 Python 3.9.5 開(kāi)始 ipaddress 模塊不再接受 IPv4 地址字符串中有任何前綴的零。 (由 Christian Heimes 在 bpo-36384 中貢獻(xiàn)。)

    math

    對(duì) math.gcd() 函數(shù)進(jìn)行了擴(kuò)展以處理多個(gè)參數(shù)。 在之前版本中,它只支持兩個(gè)參數(shù)。 (由 Serhiy Storchaka 在 bpo-39648 中貢獻(xiàn)。)

    增加了 math.lcm(): 返回指定參數(shù)的最小公倍數(shù)。 (由 Mark Dickinson, Ananthakrishnan 和 Serhiy Storchaka 在 bpo-39479 和 bpo-39648 中貢獻(xiàn)。)

    增加了 math.nextafter(): 返回從 xy 方向的下一個(gè)浮點(diǎn)數(shù)值。 (由 Victor Stinner 在 bpo-39288 中貢獻(xiàn)。)

    增加了 math.ulp(): 返回一個(gè)浮點(diǎn)數(shù)的最小有效比特位。 (由 Victor Stinner 在 bpo-39310 中貢獻(xiàn)。)

    multiprocessing

    multiprocessing.SimpleQueue 類(lèi)新增了 close() 方法用來(lái)顯式地關(guān)閉隊(duì)列。 (由 Victor Stinner 在 bpo-30966 中貢獻(xiàn)。)

    nntplib

    現(xiàn)在 NNTP 和 NNTP_SSL 當(dāng)它們的構(gòu)造器所給定的超時(shí)參數(shù)為零以防止創(chuàng)建非阻塞套接字時(shí)會(huì)引發(fā) ValueError。 (由 Dong-hee Na 在 bpo-39259 中貢獻(xiàn)。)

    os

    增加了 CLD_KILLED 和 CLD_STOPPED 作為 si_code。 (由 Dong-hee Na 在 bpo-38493 中貢獻(xiàn)。)

    對(duì)外公開(kāi)了 Linux 專(zhuān)屬的 os.pidfd_open() (bpo-38692) 和 os.P_PIDFD (bpo-38713) 用于文件描述符的進(jìn)程管理。

    現(xiàn)在 os.unsetenv() 函數(shù)在 Windows 上也已可用。 (由 Victor Stinner 在 bpo-39413 中貢獻(xiàn)。)

    現(xiàn)在 os.putenv() 和 os.unsetenv() 函數(shù)將總是可用。 (由 Victor Stinner 在 bpo-39395 中貢獻(xiàn)。)

    增加了 os.waitstatus_to_exitcode() 函數(shù):將等待狀態(tài)轉(zhuǎn)換為退出碼。 (由 Victor Stinner 在 bpo-40094 中貢獻(xiàn)。)

    pathlib

    增加了 pathlib.Path.readlink(),其行為類(lèi)似于 os.readlink()。 (由 Girts Folkmanis 在 bpo-30618 中貢獻(xiàn)。)

    pdb

    在 Windows 上 Pdb 現(xiàn)在支持 ~/.pdbrc。 (由 Tim Hopper 和 Dan Lidral-Porter 在 bpo-20523 中貢獻(xiàn)。)

    poplib

    現(xiàn)在 POP3 和 POP3_SSL 當(dāng)它們的構(gòu)造器所給定的超時(shí)參數(shù)為零以防止創(chuàng)建非阻塞套接字時(shí)會(huì)引發(fā) ValueError。 (由 Dong-hee Na 在 bpo-39259 中貢獻(xiàn)。)

    pprint

    現(xiàn)在 pprint 能美化打印 types.SimpleNamespace。 (由 Carl Bordum Hansen 在 bpo-37376 中貢獻(xiàn)。)

    pydoc

    文檔字符串的顯示現(xiàn)在不僅針對(duì)類(lèi)、函數(shù)、方法等,也針對(duì)任何具有自己的 __doc__ 屬性的對(duì)象。 (由 Serhiy Storchaka 在 bpo-40257 中貢獻(xiàn)。)

    random

    增加了新的 random.Random.randbytes 方法:生成隨機(jī)字節(jié)串。 (由 Victor Stinner 在 bpo-40286 中貢獻(xiàn)。)

    signal

    對(duì)外公開(kāi)了 Linux 專(zhuān)屬的 signal.pidfd_send_signal() 用于向使用文件描述符而非 pid 的進(jìn)程發(fā)送信號(hào)。 (bpo-38712)

    smtplib

    現(xiàn)在 SMTP 和 SMTP_SSL 當(dāng)它們的構(gòu)造器所給定的超時(shí)參數(shù)為零以防止創(chuàng)建非阻塞套接字時(shí)會(huì)引發(fā) ValueError。 (由 Dong-hee Na 在 bpo-39259 中貢獻(xiàn)。)

    現(xiàn)在 LMTP 構(gòu)造器具有可選的 timeout 形參。 (由 Dong-hee Na 在 bpo-39329 中貢獻(xiàn)。)

    socket

    socket 模塊現(xiàn)在會(huì)在 Linux 4.1 或更高版本上導(dǎo)出 CAN_RAW_JOIN_FILTERS 常量。 (由 Stefan Tatschner 和 Zackery Spytz 在 bpo-25780 中貢獻(xiàn)。)

    現(xiàn)在 socket 模塊會(huì)在支持的平臺(tái)上支持 CAN_J1939 協(xié)議。 (由 Karl Ding 在 bpo-40291 上貢獻(xiàn)。)

    現(xiàn)在 socket 模塊具有 socket.send_fds() 和 socket.recv_fds() 函數(shù)。 (由 Joannah Nanjekye, Shinya Okano 和 Victor Stinner 在 bpo-28724 中貢獻(xiàn)。)

    time

    On AIX, thread_time() is now implemented with thread_cputime() which has nanosecond resolution, rather than clock_gettime(CLOCK_THREAD_CPUTIME_ID) which has a resolution of 10 milliseconds. (Contributed by Batuhan Taskaya in bpo-40192)

    sys

    增加了新的 sys.platlibdir 屬性:平臺(tái)專(zhuān)屬庫(kù)目錄的名稱(chēng)。 它被用于構(gòu)建標(biāo)準(zhǔn)庫(kù)的路徑以及已安裝擴(kuò)展模塊的路徑。 它在大多數(shù)平臺(tái)上等于 "lib"。 在 Fedora 和 SuSE 上,它等于 64 位平臺(tái)上的 "lib64"。 (由 Jan Matějek, Matěj Cepl, Charalampos Stratakis 和 Victor Stinner 在 bpo-1294959 中貢獻(xiàn)。)

    之前的版本中,sys.stderr 在非交互模式時(shí)是帶塊緩沖的。 現(xiàn)在 stderr 默認(rèn)總是為行緩沖的。 (由 Jendrik Seipp 在 bpo-13601 中貢獻(xiàn)。)

    tracemalloc

    增加了 tracemalloc.reset_peak() 用于將跟蹤的內(nèi)存塊峰值大小設(shè)為當(dāng)前大小,以測(cè)量特定代碼段的峰值。 (由 Huon Wilson 在 bpo-40630 中貢獻(xiàn)。)

    typing

    PEP 593 引入了一種 typing.Annotated 類(lèi)型以使用上下文專(zhuān)屬的元數(shù)據(jù)來(lái)裝飾現(xiàn)有類(lèi)型,并將新的 include_extras 形參添加到 typing.get_type_hints() 以在運(yùn)行時(shí)訪問(wèn)元數(shù)據(jù)。 (由 Till Varoquaux 和 Konstantin Kashin 貢獻(xiàn)。)

    unicodedata

    Unicode 數(shù)據(jù)庫(kù)已更新到 13.0.0 版。 (bpo-39926)。

    venv

    由 venv 所提供的激活腳本現(xiàn)在總是會(huì)使用 __VENV_PROMPT__ 設(shè)置的值來(lái)一致地指明它們的自定義提示符。 在之前版本中某些腳本會(huì)無(wú)條件地使用 __VENV_PROMPT__,而另一些腳本只在其恰好被設(shè)置時(shí)(這是默認(rèn)情況)才會(huì)使用,還有的腳本會(huì)改用 __VENV_NAME__。 (由 Brett Cannon 在 bpo-37663 中貢獻(xiàn)。)

    xml

    當(dāng)把 xml.etree.ElementTree 序列化為 XML 文件時(shí)屬性?xún)?nèi)部的空白字符現(xiàn)在將被保留。 不同的行結(jié)束符不會(huì)再被正規(guī)化為 “n”。 這是對(duì)于如何解讀 XML 規(guī)范 2.11 節(jié)的相關(guān)討論的最終結(jié)果。 (由 Mefistotelis 在 bpo-39011 中貢獻(xiàn)。)

    性能優(yōu)化

    • 優(yōu)化了在推導(dǎo)式中為臨時(shí)變量賦值的慣用方式。 現(xiàn)在推導(dǎo)式中的 for y in [expr] 會(huì)與簡(jiǎn)單賦值語(yǔ)句 y = expr 一樣快速。 例如:

      sums = [s for s in [0] for x in data for s in [s + x]]

      不同于 := 運(yùn)算符,這個(gè)慣用方式不會(huì)使變量泄露到外部作用域中。

      (由 Serhiy Storchaka 在 bpo-32856 中貢獻(xiàn)。)

    • 優(yōu)化了多線(xiàn)程應(yīng)用中的信號(hào)處理。 如果一個(gè)線(xiàn)程不是獲得信號(hào)的主線(xiàn)程,字節(jié)碼求值循環(huán)不會(huì)在每條字節(jié)碼指令上被打斷以檢查無(wú)法被處理的掛起信號(hào)。 只有主解釋器的主線(xiàn)程能夠處理信號(hào)。

      在之前版本中,字節(jié)碼求值循環(huán)會(huì)在每條指令上被打斷直到主線(xiàn)程處理了信號(hào)。 (由 Victor Stinner 在 bpo-40010 上貢獻(xiàn)。)

    • 在 FreeBSD 上使用 closefrom() 優(yōu)化了 subprocess 模塊。 (由 Ed Maste, Conrad Meyer, Kyle Evans, Kubilay Kocak 和 Victor Stinner 在 bpo-38061 中貢獻(xiàn)。)

    • PyLong_FromDouble() is now up to 1.87x faster for values that fit into long. (Contributed by Sergey Fedoseev in bpo-37986.)

    • 多個(gè) Python 內(nèi)置類(lèi)型 (range, tuple, set, frozenset, list, dict) 現(xiàn)在通過(guò)使用 PEP 590 向量調(diào)用協(xié)議得到加速。 (由 Dong-hee Na, Mark Shannon, Jeroen Demeyer 和 Petr Viktorin 在 bpo-37207 中貢獻(xiàn)。)

    • 當(dāng)另一集合遠(yuǎn)大于基礎(chǔ)集合的情況下優(yōu)化了 difference_update() 的性能。 (由 Evgeny Kapun 提議,由 Michele Orrù 在 bpo-8425 中貢獻(xiàn)代碼。)

    • Python 的小對(duì)象分配器 (obmalloc.c) 現(xiàn)在允許(至多)一個(gè)空位可用于立即重用,而不必將其返回給 OS。 這可以防止簡(jiǎn)單循環(huán)中的多余消耗,在每次迭代中可以創(chuàng)建和銷(xiāo)毀全新的空位。 (由 Tim Peters 在 bpo-37257 中貢獻(xiàn)。)

    • 浮點(diǎn)數(shù)運(yùn)算中的 floor division 現(xiàn)在會(huì)有更好的性能。 并且此運(yùn)算的 ZeroDivisionError 的消息也已更新。 (由 Dong-hee Na 在 bpo-39434 中貢獻(xiàn)。)

    • 使用 UTF-8 和 ascii 編解碼器解碼短 ASCII 字符串現(xiàn)在會(huì)加快大約 15%。 (由 Inada Naoki 在 bpo-37348 中貢獻(xiàn)。)

    以下是對(duì)從 Python 3.4 到 Python 3.9 的提升提升情況的總結(jié):

     
     
     
    1. Python version 3.4 3.5 3.6 3.7 3.8 3.9
    2. -------------- --- --- --- --- --- ---
    3. Variable and attribute read access:
    4. read_local 7.1 7.1 5.4 5.1 3.9 3.9
    5. read_nonlocal 7.1 8.1 5.8 5.4 4.4 4.5
    6. read_global 15.5 19.0 14.3 13.6 7.6 7.8
    7. read_builtin 21.1 21.6 18.5 19.0 7.5 7.8
    8. read_classvar_from_class 25.6 26.5 20.7 19.5 18.4 17.9
    9. read_classvar_from_instance 22.8 23.5 18.8 17.1 16.4 16.9
    10. read_instancevar 32.4 33.1 28.0 26.3 25.4 25.3
    11. read_instancevar_slots 27.8 31.3 20.8 20.8 20.2 20.5
    12. read_namedtuple 73.8 57.5 45.0 46.8 18.4 18.7
    13. read_boundmethod 37.6 37.9 29.6 26.9 27.7 41.1
    14. Variable and attribute write access:
    15. write_local 8.7 9.3 5.5 5.3 4.3 4.3
    16. write_nonlocal 10.5 11.1 5.6 5.5 4.7 4.8
    17. write_global 19.7 21.2 18.0 18.0 15.8 16.7
    18. write_classvar 92.9 96.0 104.6 102.1 39.2 39.8
    19. write_instancevar 44.6 45.8 40.0 38.9 35.5 37.4
    20. write_instancevar_slots 35.6 36.1 27.3 26.6 25.7 25.8
    21. Data structure read access:
    22. read_list 24.2 24.5 20.8 20.8 19.0 19.5
    23. read_deque 24.7 25.5 20.2 20.6 19.8 20.2
    24. read_dict 24.3 25.7 22.3 23.0 21.0 22.4
    25. read_strdict 22.6 24.3 19.5 21.2 18.9 21.5
    26. Data structure write access:
    27. write_list 27.1 28.5 22.5 21.6 20.0 20.0
    28. write_deque 28.7 30.1 22.7 21.8 23.5 21.7
    29. write_dict 31.4 33.3 29.3 29.2 24.7 25.4
    30. write_strdict 28.4 29.9 27.5 25.2 23.1 24.5
    31. Stack (or queue) operations:
    32. list_append_pop 93.4 112.7 75.4 74.2 50.8 50.6
    33. deque_append_pop 43.5 57.0 49.4 49.2 42.5 44.2
    34. deque_append_popleft 43.7 57.3 49.7 49.7 42.8 46.4
    35. Timing loop:
    36. loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3

    以上結(jié)果是由以下變量訪問(wèn)基準(zhǔn)測(cè)試腳本所生成的: Tools/scripts/var_access_benchmark.py。 該基準(zhǔn)測(cè)試腳本以納秒為單位顯示時(shí)間。 基準(zhǔn)測(cè)試數(shù)據(jù)是在一塊 Intel? Core? i7-4960HQ 處理器 運(yùn)行從 python.org 獲取的 macOS 64 位編譯版本所得到的。

    棄用

    • distutils 的 bdist_msi 命令現(xiàn)在已被棄用,請(qǐng)改用 bdist_wheel (wheel 包)。 (由 Hugo van Kemenade 在 bpo-39586 中貢獻(xiàn)。)

    • 目前 math.factorial() 接受具有非負(fù)整數(shù)值的 float 實(shí)例 (如 5.0)。 對(duì)于非整數(shù)和負(fù)浮點(diǎn)數(shù)它會(huì)引發(fā) ValueError。 此行為現(xiàn)在已被棄用。 在未來(lái)的 Python 版本中對(duì)所有浮點(diǎn)數(shù)都將引發(fā) TypeError。 (由 Serhiy Storchaka 在 bpo-37315 中貢獻(xiàn)。)

    • parsersymbol 模塊已被棄用并將在未來(lái)的 Python 版本中移除。 對(duì)于大多數(shù)用例,用戶(hù)都可以使用 ast 模塊來(lái)控制抽象語(yǔ)法樹(shù) (AST) 的生成和編譯階段。

    • 公有 C API 函數(shù) PyParser_SimpleParseStringFlags(), PyParser_SimpleParseStringFlagsFilename(), PyParser_SimpleParseFileFlags()PyNode_Compile() 已被棄用并將在 Python 3.10 版與舊解析器一起被移除。

    • 在布爾運(yùn)算中使用 NotImplemented 已被棄用,因?yàn)樗鼛缀醣囟ㄊ遣徽_的富比較運(yùn)算符實(shí)現(xiàn)的結(jié)果。 它將在未來(lái)的 Python 版本中引發(fā) TypeError。 (由 Josh Rosenberg 在 bpo-35712 中貢獻(xiàn)。)

    • random 模塊目前接受任何可哈希類(lèi)型作為可能的種子值。 不幸的是,某些這樣的類(lèi)型并不保證具有確定性的哈希值。 在 Python 3.9 之后,該模塊將限定其種子值為 None, int, float, str, bytes 以及 bytearray。

    • 打開(kāi) GzipFile 文件用于寫(xiě)入而不指定 mode 參數(shù)的特性已被棄用。 在未來(lái)的 Python 版本中將總是默認(rèn)打開(kāi)用于讀取。 在打開(kāi)文件用于寫(xiě)入時(shí)請(qǐng)指定 mode 參數(shù)以靜默相關(guān)警告信息。 (由 Serhiy Storchaka 在 bpo-28286 中貢獻(xiàn)。)

    • 棄用了 _tkinter.TkappTypesplit() 方法而改用 splitlist() 方法,此方法具有更穩(wěn)定且可預(yù)測(cè)的行為。 (由 Serhiy Storchaka 在 bpo-38371 中貢獻(xiàn)。)

    • 將協(xié)程對(duì)象顯式傳遞給 asyncio.wait() 的做法已被棄用并且將在 3.11 版中被移除。 (由 Yury Selivanov 和 Kyle Stanley 在 bpo-34790 中貢獻(xiàn)。)

    • binhex4 和 hexbin4 標(biāo)準(zhǔn)現(xiàn)已被棄用。 binhex 模塊和下列 binascii 函數(shù)現(xiàn)已被棄用:

      • b2a_hqx(), a2b_hqx()

      • rlecode_hqx(), rledecode_hqx()

      (由 Victor Stinner 在 bpo-39353 中貢獻(xiàn)。)

    • ast 類(lèi) slice, IndexExtSlice 被視為已棄用并將在未來(lái)的 Python 版本中被移除。 應(yīng)當(dāng)使用 value 本身而不再是 Index(value)。 應(yīng)當(dāng)使用 Tuple(slices, Load()) 而不再是 ExtSlice(slices)。 (由 Serhiy Storchaka 在 bpo-34822 中貢獻(xiàn)。)

    • ast 類(lèi) Suite, Param, AugLoadAugStore 被視為已棄用并將在未來(lái)的 Python 版本中被移除。 它們不會(huì)被解析器所生成且不會(huì)被 Python 3 中的代碼生成器所接受。 (由 Batuhan Taskaya 在 bpo-39639 和 bpo-39969 中以及 Serhiy Storchaka 在 bpo-39988 中貢獻(xiàn)。)

    • PyEval_InitThreads() 和 PyEval_ThreadsInitialized() 函數(shù)現(xiàn)已被棄用并將在 Python 3.11 中被移除。 調(diào)用 PyEval_InitThreads() 現(xiàn)在沒(méi)有任何效果。 自 Python 3.7 起 GIL 會(huì)由 Py_Initialize() 初始化。 (由 Victor Stinner 在 bpo-39877 中貢獻(xiàn)。)

    • 傳入 None 作為 shlex.split() 函數(shù)的第一個(gè)參數(shù)的做法已被棄用。 (由 Zackery Spytz 在 bpo-33262 中貢獻(xiàn)。)

    • smtpd.MailmanProxy() 現(xiàn)在已被棄用,因?yàn)樗跊](méi)有外部模塊 mailman 的情況下無(wú)法使用。 (由 Samuel Colvin 在 bpo-35800 中貢獻(xiàn)。)

    • 現(xiàn)在 lib2to3 模塊將發(fā)出 PendingDeprecationWarning。 Python 3.9 已切換到 PEG 解析器 (參見(jiàn) PEP 617),Python 3.10 可以會(huì)包含 lib2to3 的 LL(1) 解析器所不能解析的新語(yǔ)法。 lib2to3 模塊可能會(huì)在未來(lái)的 Python 版本中被移出標(biāo)準(zhǔn)庫(kù)。 請(qǐng)考慮使用第三方替換例如 LibCST 或 parso。 (由 Carl Meyer 在 bpo-40360 中貢獻(xiàn)。)

    • random.shuffle() 的 random 形參已被棄用。 (由 Raymond Hettinger 在 bpo-40465 中貢獻(xiàn)。)

    移除

    • unittest.mock.__version__ 上的錯(cuò)誤版本已經(jīng)被移除。

    • nntplib.NNTP: xpath()xgtitle() 方法已被移除。 這些方法自 Python 3.3 起已被棄用。 一般來(lái)說(shuō),這些擴(kuò)展都不再為 NNTP 服務(wù)管理員所支持或啟用。 對(duì)于 xgtitle(),請(qǐng)改用 nntplib.NNTP.descriptions() 或 nntplib.NNTP.description()。 (由 Dong-hee Na 在 bpo-39366 中貢獻(xiàn)。)

    • array.array: tostring()fromstring() 方法已被移除。 它們分別是 tobytes()frombytes() 的別名,自 Python 3.2 起已被棄用。 (由 Victor Stinner 在 bpo-38916 中貢獻(xiàn)。)

    • 未寫(xiě)入文檔的 sys.callstats() 函數(shù)已被移除。 自 Python 3.7 起它就已被棄用并且總是會(huì)返回 None。 它需要一個(gè)特殊的構(gòu)建選項(xiàng) CALL_PROFILE 而該選項(xiàng)在 Python 3.7 中已被移除。 (由 Victor Stinner 在 bpo-37414 中貢獻(xiàn)。)

    • sys.getcheckinterval()sys.setcheckinterval() 函數(shù)已被移除。 它們自 Python 3.2 起已被棄用。 請(qǐng)改用 sys.getswitchinterval() 和 sys.setswitchinterval()。 (由 Victor Stinner 在 bpo-37392 中貢獻(xiàn)。)

    • C 函數(shù) PyImport_Cleanup() 已被移除。 它原本的文檔為: “清空模塊表。 僅限內(nèi)部使用?!?(由 Victor Stinner 在 bpo-36710 中貢獻(xiàn)。)

    • _dummy_threaddummy_threading 模塊已被移除。 這些模塊自 Python 3.7 起已被棄用,它們需要線(xiàn)程支持。 (由 Victor Stinner 在 bpo-37312 中貢獻(xiàn)。)

    • aifc.open() 的別名 aifc.openfp(),sunau.open() 的別名 sunau.openfp(),以及 wave.open() 的別名 wave.openfp() 已被移除。 它們自 Python 3.7 起已被棄用。 (由 Victor Stinner 在 bpo-37320 中貢獻(xiàn)。)

    • threading.Thread 的 isAlive() 方法已被移除。 它自 Python 3.8 起已被棄用。 請(qǐng)改用 is_alive()。 (由 Dong-hee Na 在 bpo-37804 中貢獻(xiàn)。)

    • ElementTree 模塊中 ElementTree 和 Element 等類(lèi)的 getchildren()getiterator() 方法已被移除。 它們?cè)?Python 3.2 中已被棄用。 請(qǐng)使用 iter(x)list(x) 替代 x.getchildren() 并用 x.iter()list(x.iter()) 替代 x.getiterator()。 (由 Serhiy Storchaka 在 bpo-36543 中貢獻(xiàn)。)

    • 舊的 plistlib API 已被移除,它自 Python 3.4 起已被棄用。 請(qǐng)使用 load(), loads(), dump() 和 dumps() 等函數(shù)。 此外,use_builtin_types 形參已被移除而總是會(huì)使用 bytes 對(duì)象。 (由 Jon Janzen 在 bpo-36409 中貢獻(xiàn)。)

    • C 函數(shù) PyGen_NeedsFinalizing 已被移除。 它未被寫(xiě)入文檔、未經(jīng)測(cè)試,且自 PEP 442 實(shí)現(xiàn)之后未在 CPython 的任何地方被使用。 由 Joannah Nanjekye 提供補(bǔ)丁。 (由 Joannah Nanjekye 在 bpo-15088 中貢獻(xiàn)。)

    • 自 Python 3.1 起被棄用的別名 base64.encodestring()base64.decodestring() 已被移除:請(qǐng)改用 base64.encodebytes() 和 base64.decodebytes()。 (由 Victor Stinner 在 bpo-39351 中貢獻(xiàn)。)

    • fractions.gcd() 函數(shù)已被移除,它自 Python 3.5 起被棄用 (bpo-22486):請(qǐng)改用 math.gcd()。 (由 Victor Stinner 在 bpo-39350 中貢獻(xiàn)。)

    • bz2.BZ2File 的 buffering 形參已被移除。 它自 Python 3.0 起即被忽略,使用它將會(huì)引發(fā) DeprecationWarning。 請(qǐng)傳入一個(gè)打開(kāi)文件對(duì)象來(lái)控制文件的打開(kāi)方式。 (由 Victor Stinner 在 bpo-39357 中貢獻(xiàn)。)

    • json.loads() 的 encoding 形參已被移除。 它在 Python 3.1 中已被棄用和忽略;自 Python 3.8 起使用它將會(huì)引發(fā) DeprecationWarning。 (由 Inada Naoki 在 bpo-39377 中貢獻(xiàn)。)

    • with (await asyncio.lock):with (yield from asyncio.lock): 語(yǔ)句已不再受支持,請(qǐng)改用 async with lock。 asyncio.Conditionasyncio.Semaphore 也同樣如此。 (由 Andrew Svetlov 在 bpo-34793 中貢獻(xiàn)。)

    • sys.getcounts() 函數(shù),-X showalloccount 命令行選項(xiàng)以及 C 結(jié)構(gòu)體 PyConfig 的 show_alloc_count 字段已被移除。 它們需要使用定義了 COUNT_ALLOCS 宏的特殊 Python 編譯版本。 (由 Victor Stinner 在 bpo-39489 中貢獻(xiàn)。)

    • typing.NamedTuple 類(lèi)的 _field_types 屬性已被移除。 它自 Python 3.8 起已被棄用。 請(qǐng)改用 __annotations__ 屬性。 (由 Serhiy Storchaka 在 bpo-40182 中貢獻(xiàn)。)

    • symtable.SymbolTable.has_exec() 方法已被移除。 它自 2006 年起已被棄用,當(dāng)被調(diào)用時(shí)僅會(huì)返回 False。 (由 Batuhan Taskaya 在 bpo-40208 中貢獻(xiàn)。)

    • asyncio.Task.current_task()asyncio.Task.all_tasks() 已被移除。 它們自 Python 3.7 起已被棄用,你可以改用 asyncio.current_task() 和 asyncio.all_tasks()。 (由 Rémi Lapeyre 在 bpo-40967 中貢獻(xiàn)。)

    • html.parser.HTMLParser 類(lèi)的 unescape() 方法已被移除(它自 Python 3.4 起已被棄用)。 應(yīng)當(dāng)使用 html.unescape() 來(lái)將字符引用轉(zhuǎn)換為對(duì)應(yīng)的 unicode 字符。

    移植到 Python 3.9

    本節(jié)列出了先前描述的更改以及可能需要更改代碼的其他錯(cuò)誤修正.

    Python API 的變化

    • __import__() 和 importlib.util.resolve_name() 現(xiàn)在會(huì)引發(fā) ImportError 取代之前所引發(fā)的 ValueError。 捕獲特定異常類(lèi)型并同時(shí)支持 Python 3.9 和更早版本的調(diào)用者將需要使用 except (ImportError, ValueError): 來(lái)同時(shí)捕獲兩者。

    • venv 激活腳本不再將 __VENV_PROMPT__ 被設(shè)為 "" 的情況作為特例處理。

    • select.epoll.unregister() 方法不會(huì)再忽略 EBADF 錯(cuò)誤。 (由 Victor Stinner 在 bpo-39239 中貢獻(xiàn)。)

    • bz2.BZ2File 的 compresslevel 形參已成為僅限關(guān)鍵字形參,因?yàn)?buffering 形參已被移除。 (由 Victor Stinner 在 bpo-39357 中貢獻(xiàn)。)

    • 簡(jiǎn)化了 AST 的抽取操作。 簡(jiǎn)單索引將以它們的值來(lái)代表,擴(kuò)展切片將以元組形式來(lái)代表。 Index(value) 將返回 value 本身,ExtSlice(slices) 將返回 Tuple(slices, Load())。 (由 Serhiy Storchaka 在 bpo-34822 中貢獻(xiàn)。)

    • 當(dāng)使用了 -E 或 -I 命令行參數(shù)時(shí) importlib 模塊現(xiàn)在會(huì)忽略 PYTHONCASEOK 環(huán)境變量。

    • encoding 形參已作為僅限關(guān)鍵字形參被添加到 ftplib.FTP 和 ftplib.FTP_TLS 類(lèi),并且默認(rèn)編碼格式由 Latin-1 改為 UTF-8 以遵循 RFC 2640。

    • asyncio.loop.shutdown_default_executor() 已被添加到 AbstractEventLoop,這意味著繼承自它的替代事件循環(huán)應(yīng)當(dāng)定義此方法。 (由 Kyle Stanley 在 bpo-34037 中貢獻(xiàn)。)

    • 更新了 __future__ 模塊中未來(lái)特性旗標(biāo)的常量值以防止與編譯器旗標(biāo)相沖突。 在之前版本中 PyCF_ALLOW_TOP_LEVEL_AWAIT 會(huì)與 CO_FUTURE_DIVISION 發(fā)生沖突。 (由 Batuhan Taskaya 在 bpo-39562 中貢獻(xiàn)。)

    • array('u') 現(xiàn)在使用 wchar_t 作為 C 類(lèi)型而不是 Py_UNICODE。 這個(gè)改變不會(huì)影響其行為,因?yàn)樽?Python 3.3 起 Py_UNICODEwchar_t 的別名。 (由 Inada Naoki 在 bpo-34538 中貢獻(xiàn)。)

    • 現(xiàn)在 logging.getLogger() API 當(dāng)傳入名稱(chēng) 'root' 時(shí)將返回根日志記錄器,而在之前它則返回一個(gè)名為 'root' 的非根日志記錄器。 這可能會(huì)影響到用戶(hù)代碼明確希望使用一個(gè)名為 'root' 的非根日志記錄器,或在某個(gè)名為 'root.py' 的最高層級(jí)模塊中使用 logging.getLogger(__name__) 來(lái)實(shí)例化日志記錄器的情況。 (由 Vinay Sajip 在 bpo-37742 中貢獻(xiàn)。)

    • 現(xiàn)在 PurePath 的拆分處理當(dāng)傳入 str 或 PurePath 的實(shí)例以外的對(duì)象時(shí)會(huì)返回 NotImplemented 而不是引發(fā) TypeError。 這將允許創(chuàng)建不繼承自上述類(lèi)型的兼容類(lèi)。 (由 Roger Aiudi 在 bpo-34775 中貢獻(xiàn)。)

    • 從 Python 3.9.5 開(kāi)始 ipaddress 模塊不再接受 IPv4 地址字符串中有任何前綴的零。 前綴的零有歧義且會(huì)被某些庫(kù)解讀為八進(jìn)制數(shù)字。 例如舊版函數(shù) socket.inet_aton() 就瘵前綴的零視為八進(jìn)制數(shù)字。 最新 inet_pton() 的 glibc 實(shí)現(xiàn)則不接受任何前綴的零。 (由 Christian Heimes 在 bpo-36384 中貢獻(xiàn))。

    • codecs.lookup() 現(xiàn)在會(huì)以與 encodings.normalize_encoding() 相同的方式正規(guī)化編碼格式名稱(chēng),不同之處在于 codecs.lookup() 還會(huì)將名稱(chēng)轉(zhuǎn)換為小寫(xiě)形式。 例如``“l(fā)atex+latin1”`` 編寫(xiě)格式名稱(chēng)現(xiàn)在會(huì)被正規(guī)化為 "latex_latin1"。 (由 Jordon Xu 在 bpo-37751 中貢獻(xiàn)。)

    C API 的變化

    • Instances of 堆分配類(lèi)型 的實(shí)例(例如使用 PyType_FromSpec() 和類(lèi)似 API 創(chuàng)建的實(shí)例)自 Python 3.8 起會(huì)帶有一個(gè)對(duì)其類(lèi)型對(duì)象的引用。 正如 Python 3.8 的 “C API 的變化” 部分所述,對(duì)于大多數(shù)情況來(lái)說(shuō),這應(yīng)當(dāng)不會(huì)有任何副作用,但對(duì)于具有自定義 tp_traverse 函數(shù)的類(lèi)型來(lái)說(shuō),則要確保所有堆分配類(lèi)型的自定義 tp_traverse 函數(shù)可訪問(wèn)對(duì)象的類(lèi)型。

      示例:

          
          
          
      1. int
      2. foo_traverse(foo_struct *self, visitproc visit, void *arg) {
      3. // Rest of the traverse function
      4. #if PY_VERSION_HEX >= 0x03090000
      5. // This was not needed before Python 3.9 (Python issue 35810 and 40217)
      6. Py_VISIT(Py_TYPE(self));
      7. #endif
      8. }

      如果你的遍歷函數(shù)委托給了其基類(lèi)(或其他類(lèi))的 tp_traverse,則要確保 Py_TYPE(self) 只被訪問(wèn)一次。 請(qǐng)注意應(yīng)當(dāng)只有 堆類(lèi)型 可訪問(wèn) tp_traverse 中的類(lèi)型。

      舉例來(lái)說(shuō),如果你的 tp_traverse 函數(shù)包括以下內(nèi)容:

          
          
          
      1. base->tp_traverse(self, visit, arg)

      則要添加:

          
          
          
      1. #if PY_VERSION_HEX >= 0x03090000
      2. // This was not needed before Python 3.9 (bpo-35810 and bpo-40217)
      3. if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) {
      4. // a heap type's tp_traverse already visited Py_TYPE(self)
      5. } else {
      6. Py_VISIT(Py_TYPE(self));
      7. }
      8. #else

      (參閱 bpo-35810 和 bpo-40217 了解更多信息。)

    • PyEval_CallObject, PyEval_CallFunction, PyEval_CallMethodPyEval_CallObjectWithKeywords 函數(shù)已被棄用。 請(qǐng)改用 PyObject_Call() 及其變化形式。 (詳情參見(jiàn) bpo-29548。)

    CPython 字節(jié)碼的改變

    • 添加了 LOAD_ASSERTION_ERROR 操作碼用于處理 assert 語(yǔ)句。 在之前的版本中,如果 AssertionError 異常被屏蔽則 assert 語(yǔ)句將不能正常運(yùn)作。 (由 Zackery Spytz 在 bpo-34880 中貢獻(xiàn)。)

    • COMPARE_OP 操作碼已被拆分為四個(gè)單獨(dú)指令:

      • COMPARE_OP 用于富比較

      • IS_OP 用于 ‘is’ 和 ‘is not’ 檢測(cè)

      • CONTAINS_OP 用于 ‘in’ 和 ‘not in’ 檢測(cè)

      • JUMP_IF_NOT_EXC_MATCH 用于檢查 ‘try-except’ 語(yǔ)句中的異常。

      (由 Mark Shannon 在 bpo-39156 中貢獻(xiàn)。)

    構(gòu)建的改變

    • --with-platlibdir 選項(xiàng)添加到 configure 腳本:平臺(tái)專(zhuān)屬庫(kù)目錄的名稱(chēng),保存在新的 sys.platlibdir 屬性中。 請(qǐng)參閱 sys.platlibdir 屬性了解詳情。 (由 Jan Matějek, Matěj Cepl, Charalampos Stratakis 和 Victor Stinner 在 bpo-1294959 中貢獻(xiàn)。)

    • COUNT_ALLOCS 特殊構(gòu)建宏已被移除。 (由 Victor Stinner 在 bpo-39489 中貢獻(xiàn)。)

    • 在非 Windows 平臺(tái)上,現(xiàn)在需要用 setenv()unsetenv() 函數(shù)來(lái)構(gòu)建 Python。 (由 Victor Stinner 在 bpo-39395 中貢獻(xiàn)。)

    • 在非 Windows 平臺(tái)上,創(chuàng)建 bdist_wininst 安裝器現(xiàn)在已不受官方支持。 (詳情參見(jiàn) bpo-10945。)

    • When building Python on macOS from source, _tkinter now links with non-system Tcl and Tk frameworks if they are installed in /Library/Frameworks, as had been the case on older releases of macOS. If a macOS SDK is explicitly configured, by using --enable-universalsdk or -isysroot, only the SDK itself is searched. The default behavior can still be overridden with --with-tcltk-includes and --with-tcltk-libs. (Contributed by Ned Deily in bpo-34956.)

    • Python 現(xiàn)在可以針對(duì) Windows 10 ARM64 進(jìn)行編譯。 (由 Steve Dower 在 bpo-33125 中貢獻(xiàn)。)

    • 現(xiàn)在當(dāng)使用 --pgo 時(shí)一些單獨(dú)的測(cè)試會(huì)被跳過(guò)。 這些測(cè)試顯著增加了 PGO 任務(wù)的時(shí)間并且可能無(wú)助于提升最終可執(zhí)行文件的優(yōu)化程度。 這樣能使任務(wù)加速大約 15 倍。 運(yùn)行完整的單元測(cè)試是很慢的。 這個(gè)改變可能導(dǎo)致優(yōu)化程序稍差的構(gòu)建,因?yàn)閷⒈粓?zhí)行的代碼分支不夠多。 如果你愿意等待更緩慢的構(gòu)建,則可以使用 ./configure [..] PROFILE_TASK="-m test --pgo-extended" 來(lái)恢復(fù)舊版本的行為。 我們不保證哪個(gè) PGO 任務(wù)集能產(chǎn)生更快的構(gòu)建。 關(guān)心此問(wèn)題的用戶(hù)應(yīng)當(dāng)自行運(yùn)行相關(guān)基準(zhǔn)測(cè)試,因?yàn)榻Y(jié)果可能取決于具體環(huán)境、工作負(fù)載以及編譯工具鏈。 (請(qǐng)參閱 bpo-36044 和 bpo-37707 了解詳情。)

    C API 的改變

    新的特性

    • PEP 573: 添加了 PyType_FromModuleAndSpec() 用于通過(guò)類(lèi)來(lái)關(guān)聯(lián)一個(gè)模塊;PyType_GetModule() 和 PyType_GetModuleState() 用于獲取模塊及其狀態(tài);以及 PyCMethod 和 METH_METHOD 用于允許一個(gè)方法訪問(wèn)其定義所在的類(lèi)。 (由 Marcel Plch 和 Petr Viktorin 在 bpo-38787 中貢獻(xiàn)。)

    • 增加了 PyFrame_GetCode() 函數(shù):獲取幀代碼。 增加了 PyFrame_GetBack() 函數(shù):獲取幀的下一個(gè)外部幀。 (由 Victor Stinner 在 bpo-40421 中貢獻(xiàn)。)

    • 將 PyFrame_GetLineNumber() 添加到受限的 C API。 (由 Victor Stinner 在 bpo-40421 中貢獻(xiàn)。)

    • 增加了 PyThreadState_GetInterpreter() 和 PyInterpreterState_Get() 函數(shù)用于獲取解釋器。 增加了 PyThreadState_GetFrame() 函數(shù)用于獲取 Python 線(xiàn)程狀態(tài)的當(dāng)前幀。 增加了 PyThreadState_GetID() 函數(shù):獲取 Python 線(xiàn)程狀態(tài)的唯一標(biāo)識(shí)符。 (由 Victor Stinner 在 bpo-39947 中貢獻(xiàn)。)

    • 將新的公有 PyObject_CallNoArgs() 函數(shù)添加到 C API,該函數(shù)可不帶任何參數(shù)調(diào)用一個(gè) Python 可調(diào)用對(duì)象。 它是不帶參數(shù)調(diào)用 Python 可調(diào)用對(duì)象最有效率的方式。 (由 Victor Stinner 在 bpo-37194 中貢獻(xiàn)。)

    • 受限 C API 中的改變(如果定義了 Py_LIMITED_API 宏):

      • 提供 Py_EnterRecursiveCall() 和 Py_LeaveRecursiveCall() 作為常規(guī)函數(shù)用于受限 API。 在之前版本中是使用宏定義,但這些宏不能與無(wú)法訪問(wèn) PyThreadState.recursion_depth 字段的受限 C API 一同編譯(該結(jié)構(gòu)體在受限 C API 中是不透明的)。

      • PyObject_INIT()PyObject_INIT_VAR() 已成為常規(guī)“不透明”函數(shù)以隱藏實(shí)現(xiàn)細(xì)節(jié)。

      (由 Victor Stinner 在 bpo-38644 和 bpo-39542 中貢獻(xiàn)。)

    • 增加了 PyModule_AddType() 函數(shù)以協(xié)助將類(lèi)型加入到模塊中。 (由 Dong-hee Na 在 bpo-40024 中貢獻(xiàn)。)

    • 將 PyObject_GC_IsTracked() 和 PyObject_GC_IsFinalized() 函數(shù)添加到公有 API 以允許分別查詢(xún) Python 對(duì)象當(dāng)前是正在被追蹤還是已經(jīng)被垃圾回收器所終結(jié)。 (由 Pablo Galindo Salgado 在 bpo-40241 中貢獻(xiàn)。)

    • 增加了 _PyObject_FunctionStr() 以獲取函數(shù)類(lèi)對(duì)象的用戶(hù)友好的表示形式。 (由 Jeroen Demeyer 在 bpo-37645 中修正。)

    • 增加了 PyObject_CallOneArg() 用于調(diào)用具有一個(gè)位置參數(shù)的對(duì)象(由 Jeroen Demeyer 在 bpo-37483 中修正。)

    移植到 Python 3.9

    • PyInterpreterState.eval_frame (PEP 523) 現(xiàn)在需要有新的強(qiáng)制性形參 tstate (PyThreadState*)。 (由 Victor Stinner 在 bpo-38500 中貢獻(xiàn)。)

    • 擴(kuò)展模塊: PyModuleDef 的 m_traverse, m_clear 和 m_free 等函數(shù)在模塊狀態(tài)被請(qǐng)求但尚未被分配時(shí)將不會(huì)再被調(diào)用。 這種情況出現(xiàn)在模塊被創(chuàng)建之后且模塊被執(zhí)行 (Py_mod_exec 函數(shù)) 之前的時(shí)刻。 更準(zhǔn)確地說(shuō),這些函數(shù)在 m_size 大于 0 并且模塊狀態(tài)(即 PyModule_GetState() 的返回值)為 NULL 時(shí)將不會(huì)被調(diào)用。

      沒(méi)有模塊狀態(tài)的擴(kuò)展模塊 (<
      本文題目:創(chuàng)新互聯(lián)Python教程:Python3.9有什么新變化
      鏈接地址:http://m.5511xx.com/article/dhpecdc.html