当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python contextlib.ContextDecorator用法及代码示例


用法:

class contextlib.ContextDecorator

使上下文管理器也可以用作装饰器的基类。

ContextDecorator 继承的上下文管理器必须照常实现__enter____exit____exit__ 即使在用作装饰器时也保留其可选的异常处理。

ContextDecoratorcontextmanager() 使用,因此您会自动获得此函数。

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.org大神的英文原创作品 contextlib.ContextDecorator。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。