是否有库函数将上下文管理器转换为装饰器

时间:2018-04-04 04:50:19

标签: python

是否有一些函数可以将上下文管理器转换为装饰器?

即。我可以快速写下面的内容,但我希望不要错过这个共同的轮子。

谢谢!

def context_manager_to_decorator(context_manager: ContextManager):
  def decorator(func):
    if context_manager is None:
      return func

    @functools.wraps(func)
    def decorated(*args, **kwargs):
      with context_manager:
        return func(*args, **kwargs)
    return decorated
  return decorator

1 个答案:

答案 0 :(得分:1)

stdlib中已有与contextlib.ContextDecorator非常相似的功能。

但是,ContextDecorator是一个类,它通常使用的方式是从ContextDecorator继承(如果你有一些其他的主要基类,它可以作为mixin工作正常来吧)因此,所有上下文管理器类的实例都可以自动用作装饰器,而不是将特定实例传递给装饰器工厂。它也有一些很好的铃声和口哨,你可以通过阅读文档找到。

值得注意的是,该库中定义的大多数上下文管理器以及使用@contextlib.contextmanager装饰器创建的所有上下文管理器都已经ContextDecorator。对于内置函数中的许多其他上下文管理器和stdlib(比如文件或锁),装饰器的实用性有点可疑 - 但有一些我可以看到想要以这种方式结束的例子,如decimal上下文上下文管理器。