分享
三行代码  ›  专栏  ›  技术社区  ›  Aviel Fedida

Python,用“with”语句包装函数的decorator

  •  2
  • Aviel Fedida  · 技术社区  · 1 周前

    在Python3.7+中,有没有一种方法可以创建这样的装饰器:

    @some_dec_fun
    def fun():
        ...
    

    def fun():
        with some_dec_fun():
            ...
    
    2 回复  |  直到 1 周前
        1
  •  3
  •   match    1 周前

    你不能用装饰器“进入”另一个函数。但您可以使用decorator在特定上下文中执行“整个”修饰函数。例如,下面将执行函数 some_function some_context_manager :

    def my_decorator(func):
        def wrap():
          with some_context_manager():
              func()
        return wrap()
    
    @my_decorator
    def some_function:
      ...
    
        2
  •  3
  •   Corentin Pane    1 周前

    要添加@match answer,如果需要将using resource作为参数传递给decorator,可以使用以下代码:

    def using_dec(using_expr):
        def wrapper(func):
            def aux(*args, **kwargs):
                with using_expr():
                    return func(*args, **kwargs)
            return aux
        return wrapper
    

    @using_dec(lambda : open("resource", 'w'))
    def hello(x):
        print("hello " + str(x))