Python 3.11 程式語言的發布

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

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

Python 3.11 的新增內容包括:

  • 為了優化性能,我們已經做了大量的工作。 新分支包括與函數呼叫的加速和內聯部署、標準操作的快速解釋器的使用(x+x、x*x、xx、a[i]、a[i] = z、f(arg) C( arg)、o.method()、o.attr = z、*seq),以及Cinder 和HotPy 專案準備的最佳化。 根據負載類型的不同,程式碼執行速度可提高 10-60%。 平均而言,pyperformance 測試套件的效能提高了 25%。

    字節碼快取機制經過重新設計,解譯器啟動時間減少了10-15%。 具有程式碼和字節碼的物件現在由解釋器靜態分配,這使得消除從快取中提取的解組字節碼以及轉換具有程式碼的物件以放置在動態記憶體中的階段成為可能。

  • 在診斷訊息中顯示呼叫追蹤時,現在可以顯示有關導致錯誤的表達式的資訊(以前,僅突出顯示該行,而沒有詳細說明該行的哪一部分導致了錯誤)。 也可以透過 API 取得擴展追蹤訊息,並使用 codeobject.co_positions() 方法或 C API 函數 PyCode_Addr2Location() 將各個字節碼指令對應到原始程式碼中的特定位置。 這項變更使得偵錯巢狀字典物件、多個函數呼叫和複雜算術表達式的問題變得更加容易。 回溯(最近一次呼叫):檔案“calculation.py”,第 54 行,結果 = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError:除以零
  • 新增了對異常組的支持,使程式能夠同時產生和處理多個不同的異常。 為了對多個異常進行分組並將它們一起引發,提出了新的異常類型 ExceptionGroup 和 BaseExceptionGroup,並且添加了“ except*”表達式以突出顯示組中的各個異常。
  • BaseException 類別中新增了 add_note() 方法,可讓您將文字註解附加到異常,例如,新增拋出異常時不可用的上下文資訊。
  • 新增了一個特殊的 Self 類型來表示目前的私有類別。 Self 可用於以比使用 TypeVar 更簡單的方式註解傳回其類別實例的方法。 class MyLock: def __enter__(self) -> Self: self.lock() return self
  • 新增了特殊的 LiteralString 類型,該類型只能包含與 LiteralString 類型相容的字串文字(即裸字串和 LiteralString 字串,但不能包含任意或組合的 str 字串)。 LiteralString 類型可用於限制向函數傳遞字串參數、任意替換可能導致漏洞的字串部分,例如,在為 SQL 查詢或 shell 命令產生字串時。 def run_query(sql: LiteralString) -> ... ... def caller(任意_string: str, query_string: LiteralString, table_name: LiteralString, ) -> None: run_query("SELECT * FROM Students") # run_query( ok run_query( ok literal_string) # 好的 run_query( "SELECT * FROM" + Literal_string) # 好的 run_query(任意字串) # 錯誤 run_query( # 錯誤 f"SELECT * FROM Students WHERE name = {任意_string}" )
  • 新增了 TypeVarTuple 類型,允許使用變數泛型,這與 TypeVar 不同,TypeVar 涵蓋的不是一種類型,而是任意數量的類型。
  • 標準函式庫包括 tomllib 模組,具有解析 TOML 格式的函數。
  • 可以使用「Required」和「NotRequired」標籤來標記類型字典(TypedDict) 的各個元素,以確定必需欄位和可選欄位(預設情況下,如果總參數未設定為False,則所有宣告的欄位都是必需的)。 class Movie(TypedDict): title: stryear: NotRequired[int] m1: Movie = {"title": "Black Panther", "year": 2018} # OK m2: Movie = {"title": "Star Wars" } # OK(年份欄位是可選的) m3: Movie = {“year”: 2022} # 錯誤,必填標題欄位沒有填寫)
  • TaskGroup 類別已新增至 asyncio 模組中,並實作了等待一組任務完成的非同步上下文管理器。 使用 create_task() 方法將任務加入到群組中。 async def main(): async with asyncio.TaskGroup() as tg: task1 = tg.create_task(some_coro(...)) task2 = tg.create_task(another_coro(...)) print("兩個任務現在都已完成”)
  • 為類別、方法和函數新增了 @dataclass_transform 裝飾器,指定時,靜態類型檢查系統將物件視為使用 @dataclasses.dataclass 裝飾器。 在下面的範例中,CustomerModel 類別在檢查類型時,將與帶有 @dataclasses.dataclass 裝飾器的類別類似地進行處理,即因為有一個接受 id 和 name 變數的 __init__ 方法。 @dataclass_transform() 類別 ModelBase: ... 類別 CustomerModel(ModelBase): id: int 名稱: str
  • 在正規表示式中,加入了使用原子分組 ((?>...)) 和所有格量詞 (*+、++、?+、{m,n}+) 的函數。
  • 新增了「-P」命令列選項和 PYTHONSAFEPATH 環境變量,以停用將潛在不安全的檔案路徑自動附加到 sys.path。
  • Windows 平台的 py.exe 實用程式已顯著改進,並新增了對「-V:」語法的支援。 / 「 另外 」- 。 」
  • C API 中的許多巨集都被轉換為常規或靜態內聯函數。
  • uu、cgi、pipes、crypt、aifc、chunk、msilib、telnetlib、audioop、nis、sndhdr、imghdr、nntplib、spwd、xdrlib、cgitb、mailcap、ossaudiodev 和 sunau 模組已被棄用,並將在 Python 中刪除3.13發布。 刪除了 PyUnicode_Encode* 函數。

來源: opennet.ru

添加評論