🗾較早收集於 81m

Python 3.15 將引入 frozendict 與 sentinel 類別

Python 3.15 將引入 frozendict 與 sentinel 類別
PostLinkedIn
🗾閱讀原文: ITmedia AI+ (日本)

💡了解 Python 新增的原生功能,協助您簡化 AI 專案中的狀態管理與資料不可變性。

⚡ 30-Second TL;DR

有什麼變化

引入 frozendict 作為內建的不可變字典型別。

為什麼重要

這些變更將簡化常見的 Python 慣用語,可能減少對第三方函式庫或自訂樣板程式碼的需求,特別是在處理不可變資料結構與哨兵物件時。

下一步行動

檢查您的程式碼庫中是否有自訂的哨兵實作或不可變字典封裝,並準備將其遷移至 Python 3.15 的原生型別。

誰應關注:Developers & AI Engineers

關鍵要點

  • 引入 frozendict 作為內建的不可變字典型別。
  • 新增 sentinel 類別以標準化缺失或不可用值的表示方式。
  • 強化 Python 標準函式庫,減少對常見模式自訂實作的依賴。

🧠 深度解析

Web-grounded analysis with 22 cited sources.

🔑 增強重點摘要

  • frozendict 是一種不可變的內建型別,與標準字典不同,它不繼承自 dict,而是直接繼承自 object,以避免繼承可變方法,並在所有鍵和值都可雜湊時自身也可雜湊,使其可用作其他字典的鍵或集合的元素,以及 functools.lru_cache() 的參數。
  • sentinel 類別旨在解決現有慣用語(例如使用 object())的缺點,這些缺點包括 repr 不具資訊性、缺乏明確的型別簽章,以及在複製或序列化/反序列化後身份可能不一致的問題。
  • Python 3.15 除了引入 frozendict 和 sentinel 外,還包含其他重要更新,例如透過 PEP 810 實現的顯式惰性導入以加快啟動時間、升級的 JIT 編譯器、改進的錯誤訊息、新的統計採樣分析器 (Tachyon, PEP 799),以及將 UTF-8 作為預設編碼 (PEP 686)。
  • sentinel 物件在布林上下文中被視為「真值」(truthy),這與 None 的「假值」(falsy)行為不同,並且支援在型別註釋中使用 | 運算符,使其在型別系統中具有與 None 類似的特殊處理。
  • frozendict 和 sentinel 的引入是經過長期討論和多個 PEP 提案的結果,例如 frozendict 的概念早在 2012 年的 PEP 416 中就被提出但被拒絕,而 sentinel 的標準化需求則在 2021 年的郵件列表討論中浮現。

🛠️ 技術深入

  • frozendict:
    • 作為內建型別,它不繼承自 dict,而是直接繼承自 object,以避免繼承可變方法。
    • 只要其所有鍵和值都是可雜湊的,frozendict 實例本身就是可雜湊的,這使其可以用作集合元素或字典鍵。
    • 它保留了插入順序,與 Python 3.6 以後的標準 dict 行為一致。
    • 支援聯集運算符 (||=),這些運算會返回一個新的 frozendict 實例。
    • 可與標準 dict 進行相等性比較。
    • 標準函式庫中的多個模組(如 copydecimaljsonmarshalpicklepprintxml.etree.ElementTree)已更新以接受 frozendict
    • 為了性能和安全性,它在 C 語言中實現。
  • sentinel:
    • 透過 sentinel('NAME') 語法創建,其中 NAME 用於生成簡潔且具資訊性的 repr
    • 創建的 sentinel 物件在布林上下文中評估為 True(truthy),這與 NoneFalse(falsy)行為形成對比。
    • 確保物件身份在複製(例如 copy.copy())和序列化/反序列化(pickling/unpickling)過程中得以保留。
    • 支援在型別註釋中直接使用 | 運算符,例如 int | MISSING,型別檢查器會對此進行特殊處理。
    • 提供 C API (PySentinel_New()) 以供 C 語言擴展使用。
    • 在同一模組中,如果使用相同的名稱調用 sentinel(),將返回現有的 sentinel 物件,確保單例行為。

🔮 前景展望AI analysis grounded in cited sources

Python 程式碼的可靠性和可維護性將會提高。
frozendict 提供了內建的不可變字典,減少了意外修改的風險,而 sentinel 類別則標準化了缺失值的表示,提高了程式碼的清晰度和型別安全性,從而減少了錯誤並簡化了除錯。
Python 生態系統將減少對第三方不可變字典庫和自訂 sentinel 實作的依賴。
將 frozendict 和 sentinel 作為內建型別,將鼓勵開發者採用標準化解決方案,從而降低專案的依賴複雜性並提高互操作性。

時間線

1980年代末
Guido van Rossum 開始開發 Python。
2008
Python 3.0 發布。
2012-02
PEP 416 (Add a frozendict builtin type) 提出,後被拒絕。
2021-06
PEP 661 (Sentinel Values) 由 Tal Einat 創建。
2025-05
Python 3.15 開發開始。
2026-05-07
Python 3.15.0b1 發布,標誌著功能凍結。
📰

AI 週報

閱讀本週精選 AI 大事摘要 →

👉相關動態

AI 策展新聞聚合。所有內容版權歸原始發布者所有。
原始來源: ITmedia AI+ (日本)