用法:
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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。