包装一个使用 with 的 Python 函数

Wrapping a Python function that uses with

假设有一个 python 函数 foo(),它使用了一些资源并且被调用如下:

   with foo(x,y,z) as f:
       doSomething(f)

到目前为止一切顺利。现在假设 foo 基于各种因素接收一组复杂的参数,我想定义一个包装函数来简化事情。类似于:

def simple_foo():
    if x:
       return foo(a,b,c)
    else:
       return foo(d,e,f)

现在,我想用 simple_foo 代替 foo,例如:

with simple_foo() as f:
    doSomething(f)

然而,毫不奇怪,这不起作用。我如何编写 simple_foo() 以获得此行为?

contextmanager修饰函数foo() (doc):

from contextlib import contextmanager

@contextmanager
def foo(a, b, c):
    try:
        yield a + b + c
    finally:
        pass

def simple_foo(x):
    if x:
        return foo(1, 2, 3)
    return foo(4, 5, 6)

with simple_foo(True) as v:
    print(v)

with simple_foo(False) as v:
    print(v)

打印:

6
15

您可以通过编写内部调用该函数的自定义上下文管理器来实现,请尝试下面给出的代码:

class SimpleFoo:

   def __init__(self,x,y,z, option):
       self.x = x
       self.y = y
       self.z = z
       self.option = option


    def __enter__(self):
       if self.option:
          return foo(self.x,self.y,self.z)
       else:
          return foo(self.y,self.z,self.x)

   def __exit__(self, type, value, traceback):

       if type != None:
           print("Error in SimpleFoo")
           print("Error Type :", type)
           print("Error Value :", value)
           print("Error Traceback :", traceback)
           self.status = value

现在如果你想使用它,按如下方式使用它:

with SimpleFoo(1,2,3,True) as foo:
     doSomething(foo)

希望对您有所帮助。