home.social

#contextmanager — Public Fediverse posts

Live and recent posts from across the Fediverse tagged #contextmanager, aggregated by home.social.

  1. Контекстные менеджеры в Python за пределами with open(): пишем свои и упрощаем код

    with open() знают все. Но контекстные менеджеры в Python — это не только про файлы. Они помогают безопасно управлять соединениями с БД, транзакциями, async‑ресурсами, временными настройками и cleanup‑логикой без бесконечных try/finally. В статье разбираем, как работают контекстные менеджеры, как писать свои через contextlib и где они реально упрощают продакшен‑код.

    habr.com/ru/companies/otus/art

    #контекстные_менеджеры #Python #with #contextmanager #async_Python #транзакции #работа_с_БД #cleanup #contextlib #asynccontextmanager

  2. Advanced Python Features | Hacker News

    Link
    Advanced Python Features
    https://news.ycombinator.com/item?id=37399447

    📌 Summary:
    本文系統性介紹了14項進階且較少被廣泛使用或深入探討的 Python 特性,涵蓋類型註解、語法細節、並發機制及元編程等範疇。作者貫穿多年的經驗分享,將 Python 3.12 及更高版本的新功能與既有技巧結合,並附以代碼示例方便理解。其中包括函式重載(
    @overload)透過型別提示增強函式多態、限制參數為關鍵字參數或位置參數以保證 API 一致性、未來註釋(from future import annotations)解決前置引用問題、Generics 泛型新語法、協定(Protocols)明確結構類型要求,以及 context manager 的簡化寫法。文章亦介紹結構化模式匹配(Structural Pattern Matching)強化條件判斷能力、使用 slots 以優化屬性存取、包含語法巧思如 for-else、Walrus 運算符與短路邏輯的語法優化、f-string 格式化的進階用法、裝飾器支持的快取機制、多線程與非同步並發的 Future 物件、代理屬性(Proxy Properties)創造同時具屬性與方法特性的 API,以及 Python 最神祕卻功能強大的元類(Metaclasses)應用。本文不僅串連各技巧間的內在邏輯,也點出這些語法或結構設計如何在日常開發中提升效率、代碼可讀性與型別安全,對希望深化 Python 應用層次的開發者極具實務價值。

    🎯 Key Points:
    → 1. 函式重載(Typing Overloads)
     ★ 使用
    @overload 裝飾器定義多重函式簽章,使型別檢查器可辨別依參數類型回傳不同型態。
     ★ 搭配 Literal 限定特定字串參數,如 mode 值限定為 "split" 或 "upper"。
     ★ 可透過多重簽章限制傳入參數組合(如id 或 username 二選一)。

    → 2. 關鍵字限制與位置參數限制(Keyword-only & Positional-only)
     ★ 使用 定義「關鍵字參數」強制呼叫時指定參數名。
     ★ 使用 / 限制「位置專用參數」,禁止以關鍵字呼叫。
     ★ 幫助 API 設計確保呼叫一致性與易懂性。

    → 3. 未來註釋(Future Annotations)
     ★ PEP 563 將型別註釋推遲求值,解決前置引用導致 NameError 問題。
     ★ PEP 649 進一步推動延遲計算機制,提高效能並維護反射功能。
     ★ Python 3.11 引入 Self 型別,方便自指回傳類型註解。

    → 4. 泛型(Generics,新語法在Python 3.12)
     ★ 新語法更簡潔地使用泛型類型別參數及限制,有利複雜型別定義。
     ★ 支援變數數量泛型,適合定義任意組合型別的容器類別。
     ★ 提供更符合靜態型別檢查需求的 API。

    → 5. 協定(Protocols)
     ★ 透過結構型別檢查(Structural Subtyping)實現介面功能,而非繼承。
     ★ 支援使用
    @runtime_checkable 讓 isinstance 支援協定判斷。
     ★ 強化 Python 易變的「鴨子型態檢查」機制,預防使用錯誤型別物件。

    → 6. Context Managers 簡化作法
     ★ 利用 contextlib.contextmanager 裝飾器簡化
    enter, exit 實作。
     ★ 使用 yield 以前後結構清楚區分 setup 與 teardown,提升例外安全。

    → 7. 結構化模式匹配
     ★ match-case 語法類似於其他語言的 switch,更有強大解構能力。
     ★ 可以匹配複雜結構、條件守護、序列捕獲(號運算)。
     ★ 並可與華洛斯運算子搭配實作複雜條件判斷。

    → 8.
    slots
     ★ 指定類別固定屬性,避免動態字典查找,提高存取效率。
     ★ 對記憶體及性能微優化有限,但適合大量物件產生場景。

    → 9. 常見語法巧思
     ★ for-else 判斷循環是否正常結束避免使用額外旗標。
     ★ Walrus 運算子 (:=) 用於表達式內賦值且立即使用。
     ★ 短路邏輯運算符 or 可實現多層值選擇。
     ★ 比較鏈結寫法提升可讀性(0 < x < 10)。

    → 10. f-string 進階格式化
     ★ 支援格式縮寫、數字分隔符、日期時間格式、對齊填充等。
     ★ debug 表達式可直接列印變數名稱與值。

    → 11. 快取裝飾器
     ★ functools.cache(Python 3.9 起)提供簡潔無限大小函式結果快取。
     ★ lru_cache 仍可自訂快取容量。
     ★ 透過快取優化遞迴或重複計算的效能。

    → 12. Python Futures 並發機制
     ★ concurrent.futures 模組提供類似 JS Promise 的 Future 物件。
     ★ 支援同步與非同步回呼、取消、逾時及例外處理。
     ★ 與 async/await 及 ThreadPoolExecutor 結合簡化非同步程式設計。

    → 13. Proxy Properties(代理屬性)
     ★ 利用 Descriptor 協議設計同時具屬性與可呼叫方法的雙重 API。
     ★ 可實現更彈性好用的屬性呼叫行為。

    → 14. Metaclasses(元類)
     ★ 控制類別物件的建立過程,可動態更改類別屬性或註冊類別。
     ★ 雖功能強大,但多數情況下可用裝飾器和繼承替代。
     ★ 在抽象基類(ABC)、枚舉類型、Django、SQLAlchemy 等框架中有實際應用。

    🔖 Keywords:
    #Python #TypingOverloads #ContextManager #StructuralPatternMatching #Metaclasses