Python 3.10 程式語言的發布

經過一年的開發,Python 3.10 程式語言的重要版本發布了。新分支將獲得一年半的支持,在此之後的三年半內,將為其產生修復程序以消除漏洞。

同時,Python 3.11分支的alpha測試開始(根據新的開發時間表,新分支的工作在上一個分支發布前五個月開始,並在下一個版本發佈時達到alpha測試階段)。 Python 3.11 分支將發佈為期七個月的 alpha 版本,在此期間將新增功能並修復錯誤。 此後,Beta版本將進行為期三個月的測試,在此期間將禁止添加新功能,並將全部精力集中在修復錯誤上。 在發布前的最後兩個月,該分支將處於發布候選階段,並在此階段進行最終的穩定。

Python 3.10 的新增內容包括:

  • 實現了用於模式匹配的“match”和“case”運算符,提高了程式碼可讀性,簡化了任意 Python 物件的匹配,並透過高級靜態類型檢查提高了程式碼可靠性。其實作非常類似於 Scala、Rust 和 F# 中提供的「match」運算符,它將指定表達式的結果與基於「case」運算符的區塊中列出的模式清單進行比較。

    def http_error(status): 匹配狀態: case 400: 返回“錯誤請求” case 401|403|404: 返回“不允許” case 418: 返回“我是茶壺” case _: 返回“其他東西”

    您可以解壓縮物件、元組、列表和任意序列,以根據現有值綁定變數。允許定義嵌套模板,在模板中使用附加“if”條件,使用掩碼(“[x, y, *rest]”)、鍵/值映射(例如,{“bandwidth”: b, “latency ”: l} 從字典中提取「頻寬」和「延遲」值),提取子模板(「:=」運算子),在模板中使用命名常數。在類別中,可以使用“__match__()”方法自訂匹配行為。

    from dataclasses import dataclass @dataclass class Point: x: int y: int def whereis(point): 匹配點: case Point(0, 0): print("Origin") case Point(0, y): print(f" Y={y}") case Point(x, 0): print(f"X={x}") case Point(): print("其他地方") case _: print("不是點") 符合point : case Point(x, y) if x == y: print(f"Y=X at {x}") case Point(x, y): print(f"不在對角線上") RED, GREEN,藍色= 0, 1, 2 匹配顏色: case RED: print(“我看到紅色!”) case GREEN: print(“草是綠的”) case BLUE: print(“我感到憂鬱:(“)

  • 現在可以在 with 語句中使用括號將上下文管理器集合的定義拆分為多行。也允許在群組中最後一個上下文管理器之後留下逗號: with ( CtxManager1() as example1, CtxManager2() as example2, CtxManager3() as example3, ): ...
  • 改進了與字串文字中未閉合的大括號和引號相關的錯誤的代碼位置報告。例如,當存在未閉合的大括號時,指標現在會反白顯示左大括號並指示不存在結束區塊,而不是在以下構造中報告語法錯誤。文件“example.py”,第1 行預期= {9:1, 18:2, 19:2, 27:3, 28:3, 29:3, 36:4, 37:4, ^SyntaxError: '{ '從未關閉過

    新增了額外的專門語法錯誤訊息:區塊之前和字典中缺少“:”符號,未用括號分隔元組,列表中缺少逗號,指定不帶“ except”和“finally”的“try”區塊,使用“ =」在比較中使用 " 而不是 "==",在 f 字串中指定 * 表達式。此外,它還確保突出顯示整個有問題的表達式,而不僅僅是開頭,以及有關與不正確縮排相關的錯誤上下文的更明確的資訊。 >>> def foo(): ... if lel: ... x = 2 檔案“”,第3 行x = 2 ^ IndentationError:在第2 行的“if”語句之後需要一個縮進區塊

    在函數中的屬性名稱和變數名稱拼字錯誤所導致的錯誤中,輸出具有正確名稱的建議。 >>> collections.namedtoplo Traceback(最近一次呼叫最後一次):檔案“”,第 1 行,在 中 AttributeError:模組“collections”沒有屬性“namedtoplo”。您指的是:namedtuple嗎?

  • 對於偵錯工具和分析器,追蹤事件會提供已執行程式碼的準確行號。
  • 新增了sys.flags.warn_default_encoding 設置,以顯示有關與TextIOWrapper 和open() 處理UTF-8 編碼檔案相關的潛在錯誤的警告,而無需明確指定“encoding=»utf-8”'選項(預設情況下使用ASCII 編碼)。新版本還提供了指定“encoding =“locale””值的功能,以根據目前區域設定設定編碼。
  • 打字模組中新增了一個新的運算符,它提供了用於指定類型註釋的工具,允許使用語法「X | Y」選擇其中一種類型(X 類型或 Y 類型)。 def square(數字: int | float) -> int | float: return number ** 2 相當於先前支援的建構: def square(number: Union[int, float]) -> Union[int, float]: return number ** 2
  • Concatenate 運算子和 ParamSpec 變數已新增至類型模組中,這可讓您在使用 Callable 時傳遞用於靜態類型檢查的附加資訊。 types 模組還會加入特殊值 TypeGuard 來註解類型保護函數和 TypeAlias 來明確定義類型別名。 StrCache: TypeAlias = ‘Cache[str]’ # 型別別名
  • zip() 函數實作一個可選的「strict」標誌,當指定時,它會檢查迭代的參數是否具有相同的長度。 >>> 列表(zip(('a', 'b', 'c'), (1, 2, 3), strict=True)) [('a', 1), ('b', 2) , ('c', 3)] >>> list(zip(range(3), ['fee', 'fi', 'fo', 'fum'], strict=True)) 回溯(最近一次呼叫最後): ... ValueError: zip() 參數2 比參數1 長
  • 提出了新的內建函數 aiter() 和 anext(),並實作了函數 iter() 和 next() 的非同步類似物。
  • 在處理小物件時,str()、bytes() 和 bytearray() 建構子的工作速度加快了 30-40%。
  • 減少了 runpy 模組中導入操作的數量。由於導入的模組從 3 個減少到 1.4 個,命令「python69 -m module_name」的運行速度平均提高了 51 倍。
  • LOAD_ATTR 指令對各個操作碼使用快取機制,這使得使用常規屬性的速度提高了 36%,使用插槽的速度提高了 44%。
  • 當使用“--enable-optimizations”選項建立Python時,“-fno-semantic-interposition”模式現在已啟用,與使用“--enable-shared”構建相比,它可以將解釋器速度提高高達30% “ 選項。
  • hashlib 和 ssl 模組增加了對 OpenSSL 3.0.0 的支持,並停止支援 1.1.1 之前的 OpenSSL 版本。
  • 舊的解析器已被刪除,在上一個分支中被 PEG(解析表達式語法)解析器取代。格式化程式模組已被刪除。循環參數已從 asyncio API 中刪除。先前不建議使用的方法已被刪除。操作 Py_UNICODE* 字串的 Py_UNICODE_str* 函數已被刪除。
  • distutils 模組已被棄用,並計劃在 Python 3.12 中刪除。建議使用 setuptools、packages、platform、shutil、subprocess 和 sysconfig 模組,而不是 distutils。 PyUnicodeObject 中的 wstr 結構已被棄用並計劃刪除。

來源: opennet.ru

添加評論