用法:
class contextlib.ContextDecorator
使上下文管理器也可以用作裝飾器的基類。
從
ContextDecorator
繼承的上下文管理器必須照常實現__enter__
和__exit__
。__exit__
即使在用作裝飾器時也保留其可選的異常處理。ContextDecorator
由contextmanager()
使用,因此您會自動獲得此函數。ContextDecorator
的示例:from contextlib import ContextDecorator class mycontext(ContextDecorator): def __enter__(self): print('Starting') return self def __exit__(self, *exc): print('Finishing') return False >>> @mycontext() ... def function(): ... print('The bit in the middle') ... >>> function() Starting The bit in the middle Finishing >>> with mycontext(): ... print('The bit in the middle') ... Starting The bit in the middle Finishing
對於以下形式的任何構造,此更改隻是語法糖:
def f(): with cm(): # Do stuff
ContextDecorator
讓您改為編寫:@cm() def f(): # Do stuff
它清楚地表明
cm
適用於整個函數,而不僅僅是其中的一部分(並且保存縮進級別也很好)。已經有一個基類的現有上下文管理器可以通過使用
ContextDecorator
作為一個混合類來擴展:from contextlib import ContextDecorator class mycontext(ContextBaseClass, ContextDecorator): def __enter__(self): return self def __exit__(self, *exc): return False
注意
由於裝飾函數必須能夠被多次調用,因此底層上下文管理器必須支持在多個
with
語句中使用。如果不是這種情況,則應使用函數內部帶有顯式with
語句的原始構造。3.2 版中的新函數。
相關用法
- Python contextlib.AsyncContextDecorator用法及代碼示例
- Python contextlib.AsyncExitStack用法及代碼示例
- Python contextlib.ExitStack.pop_all用法及代碼示例
- Python contextlib.redirect_stdout用法及代碼示例
- Python contextlib.aclosing用法及代碼示例
- Python contextlib.ExitStack用法及代碼示例
- Python contextlib.contextmanager用法及代碼示例
- Python contextlib.closing用法及代碼示例
- Python contextlib.nullcontext用法及代碼示例
- 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.ContextDecorator。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。