包装一个使用 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)
希望对您有所帮助。
假设有一个 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)
希望对您有所帮助。