说有一个使用某些资源的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()来获得此行为?
答案 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)
我希望这会有所帮助。