當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python contextlib.contextmanager用法及代碼示例


用法:

@contextlib.contextmanager

此函數是一個裝飾器,可用於為with 語句上下文管理器定義工廠函數,無需創建類或單獨的__enter__()__exit__() 方法。

雖然許多對象本身支持在 with 語句中使用,但有時需要管理的資源本身不是上下文管理器,並且沒有實現與 contextlib.closing 一起使用的 close() 方法

下麵是一個抽象示例,以確保正確的資源管理:

from contextlib import contextmanager

@contextmanager
def managed_resource(*args, **kwds):
    # Code to acquire resource, e.g.:
    resource = acquire_resource(*args, **kwds)
    try:
        yield resource
    finally:
        # Code to release resource, e.g.:
        release_resource(resource)

>>> with managed_resource(timeout=3600) as resource:
...     # Resource is released at the end of this block,
...     # even if code in the block raises an exception

被修飾的函數在調用時必須返回 generator-iterator。此迭代器必須隻產生一個值,該值將綁定到 with 語句的 as 子句中的目標(如果有)。

在生成器產生的地方,嵌套在 with 語句中的塊被執行。然後在退出塊後恢複生成器。如果塊中發生未處理的異常,它會在生成器中在產生產生的點重新引發。因此,您可以使用 tryexceptfinally 語句來捕獲錯誤(如果有),或確保進行一些清理。如果捕獲異常隻是為了記錄它或執行某些操作(而不是完全抑製它),則生成器必須重新引發該異常。否則,生成器上下文管理器將向with 語句指示異常已被處理,並且將繼續執行緊跟在with 語句之後的語句。

contextmanager() 使用 ContextDecorator 因此它創建的上下文管理器可以用作裝飾器以及 with 語句。當用作裝飾器時,會在每個函數調用上隱式創建一個新的生成器實例(這允許由 contextmanager() 創建的其他 “one-shot” 上下文管理器滿足上下文管理器支持多個調用以便用作裝飾器的要求) .

在 3.2 版中更改:用於contextlib.ContextDecorator.

相關用法


注:本文由純淨天空篩選整理自python.org大神的英文原創作品 contextlib.contextmanager。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。