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


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