包装与

时间:2019-06-25 17:20:52

标签: python python-3.x with-statement

说有一个使用某些资源的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()来获得此行为?

2 个答案:

答案 0 :(得分:1)

foo()doc)装饰函数contextmanager

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

答案 1 :(得分:1)

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

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)

我希望这会有所帮助。