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

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)Python教程:Python3.9有什么新變化
  • python 3.9 有什么新變化
    • 摘要 — 發(fā)布重點
    • 請檢查代碼中的 DeprecationWarning。
    • 新的特性
      • 字典合并與更新運算符
      • 新增用于移除前綴和后綴的字符串方法
      • 標準多項集中的類型標注泛型
      • 新的解析器
    • 其他語言特性修改
    • 新增模塊
      • zoneinfo
      • graphlib
    • 改進的模塊
      • 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é)碼的改變
    • 構建的改變
    • 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 日。

    詳情請參閱 更新日志。

    參見

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

    摘要 — 發(fā)布重點

    新的語法特性:

    • PEP 584,為 dict 增加合并運算符;

    • PEP 585,標準多項集中的類型標注泛型。

    • PEP 614,放寬對裝飾器的語法限制。

    新的內置特性:

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

    標準庫中的新特性:

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

    • 添加了 os.pidfd_open() 以允許不帶競爭和信號的進程管理。

    解釋器的改進:

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

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

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

    • 垃圾回收不會因恢復的對象而阻塞;

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

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

    新的庫模塊:

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

    • 圖的拓撲排序實現(xiàn)現(xiàn)在已由新的 graphlib 模塊提供。

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

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

    請檢查代碼中的 DeprecationWarning。

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

    請用 -W default 命令行選項測試應用程序來查看 DeprecationWarning 和 PendingDeprecationWarning,甚至可以用 -W error 將它們視為錯誤。 可以用 警告過濾器 忽略來自第三方代碼的警告。

    Python 3.9 是最后一個提供 Python 2 向下兼容層的版本,以給予 Python 項目維護者更多時間移除 Python 2 支持,添加 Python 3.9 支持。

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

    更通俗的說法是,請在 Python 開發(fā)模式 下運行測試,這樣做有助于讓代碼兼容 Python 的后續(xù)版本。

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

    新的特性

    字典合并與更新運算符

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

    示例:

     
     
     
    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'}

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

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

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

    標準多項集中的類型標注泛型

    在類型標注中現(xiàn)在你可以使用內置多項集類型例如 listdict 作為通用類型而不必從 typing 導入對應的大寫形式類型名 (例如 ListDict)。 標準庫中的其他一些類型現(xiàn)在同樣也是通用的,例如 queue.Queue

    示例:

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

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

    新的解析器

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

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

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

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

    其他語言特性修改

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

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

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

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

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

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

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

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

    • 調用 __iter__ 方法時發(fā)生的非預期錯誤不會再被 in 運算符以及 operator 的 contains(), indexOf() 和 countOf() 中的 TypeError 所掩蓋。 (由 Serhiy Storchaka 在 bpo-40824 中貢獻。)

    • 未加圓括號的 lambda 表達式不能再作為推導式和生成器表達式的 if 子句的表達式部分。 請參閱 bpo-41848 和 bpo-43755 了解詳情。

    新增模塊

    zoneinfo

    zoneinfo 模塊為標準庫引入了 IANA 時區(qū)數(shù)據(jù)庫。 它添加了 zoneinfo.ZoneInfo,這是一個基于系統(tǒng)時區(qū)數(shù)據(jù)的實體 datetime.tzinfo 實現(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ù)庫的平臺的一個回退數(shù)據(jù)源,還以第一方軟件包的形式發(fā)布了 tzdata 模塊 — 通過 PyPI 發(fā)行并由 CPython 核心團隊維護。

    參見

    PEP 615 — 在標準庫中支持 IANA 時區(qū)數(shù)據(jù)庫

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

    graphlib

    添加了新的 graphlib 模塊,其中包含 graphlib.TopologicalSorter 類來提供圖的拓撲排序功能。 (由 Pablo Galindo, Tim Peters 和 Larry Hastings 在 bpo-17005 中貢獻。)

    改進的模塊

    ast

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

    添加了 ast.unparse() 作為 ast 模塊中的一個函數(shù),它可被用來反解析 ast.AST 對象并產(chǎn)生相應的代碼字符串,當它被解析時將會產(chǎn)生一個等價的 ast.AST 對象。 (由 Pablo Galindo 和 Batuhan Taskaya 在 bpo-38870 中貢獻。)

    為 AST 節(jié)點添加了文檔字符串,其中包含 ASDL 簽名,可被用來構造對應的節(jié)點。 (由 Batuhan Taskaya 在 bpo-39638 中貢獻。)

    asyncio

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

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

    添加了 asyncio.PidfdChildWatcher,這是一個 Linux 專屬的子監(jiān)視器實現(xiàn),它負責輪詢進程的文件描述符。 (bpo-38692)

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

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

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

    compileall

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

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

    concurrent.futures

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

    從 ThreadPoolExecutor 和 ProcessPoolExecutor 中移除了守護線程。 這改善與與子解釋器的兼容性及它們在關閉進程時的可預測性。 (由 Kyle Stanley 在 bpo-39812 中貢獻。)

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

    curses

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

    datetime

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

    distutils

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

    fcntl

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

    ftplib

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

    gc

    當垃圾回收器進行某些復活對象的收集時(在終結器被執(zhí)行之后這些對象可以在隔離周期之外被訪問),不會阻止對所有仍然無法訪問的對象的收集。 (由 Pablo Galindo 和 Tim Peters 在 bpo-38379 中貢獻。)

    增加了一個新的函數(shù) gc.is_finalized() 用來檢測一個對象是否已被垃圾回收器所終結。 (由 Pablo Galindo 在 bpo-39322 中貢獻。)

    hashlib

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

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

    http

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

    IDLE 與 idlelib

    添加了切換光標閃爍停止的選項。 (由 Zackery Spytz 在 bpo-4603 中貢獻。)

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

    添加關鍵字到模塊名稱補全列表。 (由 Terry J. Reedy 在 bpo-37765 中貢獻。)

    3.9 維護版本中的新內容

    使 IDLE 調用 sys.excepthook() (當啟動時沒有 ‘-n’ )。用戶鉤子以前是被忽略的。 (由 Ken Hilton 在 bpo-43008 中貢獻。)

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

    重新安排設置對話框。 將常規(guī)選項卡分成 Windows 和 Shell/Ed 選項卡。 將擴展幫助菜單的幫助源移至擴展標簽。為新選項留出空間,并縮短對話框。后者使對話框更適合小屏幕。 (由 Terry Jan Reedy 貢獻于 bpo-40468 。) 將縮進空間設置從字體標簽移到新的 Windows 標簽。 (由 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 的構造器具有可選的 timeout 形參。 并且,現(xiàn)在 open() 方法也具有可選的 timeout 形參提供同樣的修改。 IMAP4_SSL 和 IMAP4_stream 中被重載的方法也應用了這個修改。 (由 Dong-hee Na 在 bpo-38615 中貢獻。)

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

    importlib

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

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

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

    來自 importlib_metadata 1.6.1 版的已更新 importlib.metadata。

    inspect

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

    ipaddress

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

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

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

    math

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

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

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

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

    multiprocessing

    multiprocessing.SimpleQueue 類新增了 close() 方法用來顯式地關閉隊列。 (由 Victor Stinner 在 bpo-30966 中貢獻。)

    nntplib

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

    os

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

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

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

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

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

    pathlib

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

    pdb

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

    poplib

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

    pprint

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

    pydoc

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

    random

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

    signal

    對外公開了 Linux 專屬的 signal.pidfd_send_signal() 用于向使用文件描述符而非 pid 的進程發(fā)送信號。 (bpo-38712)

    smtplib

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

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

    socket

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

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

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

    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 屬性:平臺專屬庫目錄的名稱。 它被用于構建標準庫的路徑以及已安裝擴展模塊的路徑。 它在大多數(shù)平臺上等于 "lib"。 在 Fedora 和 SuSE 上,它等于 64 位平臺上的 "lib64"。 (由 Jan Matějek, Matěj Cepl, Charalampos Stratakis 和 Victor Stinner 在 bpo-1294959 中貢獻。)

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

    tracemalloc

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

    typing

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

    unicodedata

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

    venv

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

    xml

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

    性能優(yōu)化

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

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

      不同于 := 運算符,這個慣用方式不會使變量泄露到外部作用域中。

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

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

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

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

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

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

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

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

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

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

    以下是對從 Python 3.4 到 Python 3.9 的提升提升情況的總結:

     
     
     
    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

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

    棄用

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

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

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

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

    • 在布爾運算中使用 NotImplemented 已被棄用,因為它幾乎必定是不正確的富比較運算符實現(xiàn)的結果。 它將在未來的 Python 版本中引發(fā) TypeError。 (由 Josh Rosenberg 在 bpo-35712 中貢獻。)

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

    • 打開 GzipFile 文件用于寫入而不指定 mode 參數(shù)的特性已被棄用。 在未來的 Python 版本中將總是默認打開用于讀取。 在打開文件用于寫入時請指定 mode 參數(shù)以靜默相關警告信息。 (由 Serhiy Storchaka 在 bpo-28286 中貢獻。)

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

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

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

      • b2a_hqx(), a2b_hqx()

      • rlecode_hqx(), rledecode_hqx()

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

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

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

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

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

    • smtpd.MailmanProxy() 現(xiàn)在已被棄用,因為它在沒有外部模塊 mailman 的情況下無法使用。 (由 Samuel Colvin 在 bpo-35800 中貢獻。)

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

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

    移除

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

    • nntplib.NNTP: xpath()xgtitle() 方法已被移除。 這些方法自 Python 3.3 起已被棄用。 一般來說,這些擴展都不再為 NNTP 服務管理員所支持或啟用。 對于 xgtitle(),請改用 nntplib.NNTP.descriptions() 或 nntplib.NNTP.description()。 (由 Dong-hee Na 在 bpo-39366 中貢獻。)

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

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

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

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

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

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

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

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

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

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

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

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

    • bz2.BZ2File 的 buffering 形參已被移除。 它自 Python 3.0 起即被忽略,使用它將會引發(fā) DeprecationWarning。 請傳入一個打開文件對象來控制文件的打開方式。 (由 Victor Stinner 在 bpo-39357 中貢獻。)

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

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

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

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

    • symtable.SymbolTable.has_exec() 方法已被移除。 它自 2006 年起已被棄用,當被調用時僅會返回 False。 (由 Batuhan Taskaya 在 bpo-40208 中貢獻。)

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

    • html.parser.HTMLParser 類的 unescape() 方法已被移除(它自 Python 3.4 起已被棄用)。 應當使用 html.unescape() 來將字符引用轉換為對應的 unicode 字符。

    移植到 Python 3.9

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

    Python API 的變化

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    C API 的變化

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

      示例:

          
          
          
      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ù)委托給了其基類(或其他類)的 tp_traverse,則要確保 Py_TYPE(self) 只被訪問一次。 請注意應當只有 堆類型 可訪問 tp_traverse 中的類型。

      舉例來說,如果你的 tp_traverse 函數(shù)包括以下內容:

          
          
          
      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ù)已被棄用。 請改用 PyObject_Call() 及其變化形式。 (詳情參見 bpo-29548。)

    CPython 字節(jié)碼的改變

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

    • COMPARE_OP 操作碼已被拆分為四個單獨指令:

      • COMPARE_OP 用于富比較

      • IS_OP 用于 ‘is’ 和 ‘is not’ 檢測

      • CONTAINS_OP 用于 ‘in’ 和 ‘not in’ 檢測

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

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

    構建的改變

    • --with-platlibdir 選項添加到 configure 腳本:平臺專屬庫目錄的名稱,保存在新的 sys.platlibdir 屬性中。 請參閱 sys.platlibdir 屬性了解詳情。 (由 Jan Matějek, Matěj Cepl, Charalampos Stratakis 和 Victor Stinner 在 bpo-1294959 中貢獻。)

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

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

    • 在非 Windows 平臺上,創(chuàng)建 bdist_wininst 安裝器現(xià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)在可以針對 Windows 10 ARM64 進行編譯。 (由 Steve Dower 在 bpo-33125 中貢獻。)

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

    C API 的改變

    新的特性

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

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

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

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

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

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

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

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

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

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

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

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

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

    移植到 Python 3.9

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

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

      沒有模塊狀態(tài)的擴展模塊 (<
      本文名稱:創(chuàng)新互聯(lián)Python教程:Python3.9有什么新變化
      瀏覽路徑:http://www.5511xx.com/article/dhpecdc.html