用法:
@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
語句中的塊被執行。然後在退出塊後恢複生成器。如果塊中發生未處理的異常,它會在生成器中在產生產生的點重新引發。因此,您可以使用try
…except
…finally
語句來捕獲錯誤(如果有),或確保進行一些清理。如果捕獲異常隻是為了記錄它或執行某些操作(而不是完全抑製它),則生成器必須重新引發該異常。否則,生成器上下文管理器將向with
語句指示異常已被處理,並且將繼續執行緊跟在with
語句之後的語句。contextmanager()
使用ContextDecorator
因此它創建的上下文管理器可以用作裝飾器以及with
語句。當用作裝飾器時,會在每個函數調用上隱式創建一個新的生成器實例(這允許由contextmanager()
創建的其他 “one-shot” 上下文管理器滿足上下文管理器支持多個調用以便用作裝飾器的要求) .在 3.2 版中更改:用於contextlib.ContextDecorator.
相關用法
- Python contextlib.closing用法及代碼示例
- Python contextlib.AsyncContextDecorator用法及代碼示例
- Python contextlib.AsyncExitStack用法及代碼示例
- Python contextlib.ExitStack.pop_all用法及代碼示例
- Python contextlib.redirect_stdout用法及代碼示例
- Python contextlib.aclosing用法及代碼示例
- Python contextlib.ExitStack用法及代碼示例
- Python contextlib.nullcontext用法及代碼示例
- Python contextlib.ContextDecorator用法及代碼示例
- Python contextlib.suppress用法及代碼示例
- Python contextvars.ContextVar.reset用法及代碼示例
- Python contextvars.Context.run用法及代碼示例
- Python configparser.ConfigParser.readfp用法及代碼示例
- Python configparser.ConfigParser.BOOLEAN_STATES用法及代碼示例
- Python configparser.BasicInterpolation用法及代碼示例
- Python configparser.ExtendedInterpolation用法及代碼示例
- Python configparser.ConfigParser.SECTCRE用法及代碼示例
- Python configparser.ConfigParser.read用法及代碼示例
- Python collections.somenamedtuple._replace用法及代碼示例
- Python collections.somenamedtuple._asdict用法及代碼示例
注:本文由純淨天空篩選整理自python.org大神的英文原創作品 contextlib.contextmanager。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。