我有一个测试类,需要在结束时进行一些清理。为了确保用户不会忘记这一点,我想在类中添加上下文管理器。我还有一个装饰器,在其中我想使用此上下文管理器创建一个测试类对象并将其传递给装饰的函数。这是否可能?
我想要做的就是:
我想要做的就是:
class test:
def __init__(self, name):
self._name = name
print "my name is {0}".format(name)
def exit():
print "exiting"
@contextmanager
def testcm(self):
print "inside cm"
try:
yield self
finally:
self.exit()
def randomtest(self, str):
print "Inside random test {0}".format(str)
def decorate(name):
def wrapper(testf):
def testf_wrapper(test):
with test(name).testcm() as testobj:
return testf(testobj)
return testf_wrapper
return wrapper
return decorate
@decorate("whatever")
def testf(testobj):
testobj.randomtest("randomness")
函数testf
接受测试类对象testobj
并对其进行处理。之后,由于上下文管理器,testcm
确保清理函数被调用。
因此有两个问题:
我如何在装饰器中使用上下文管理器?据我所知,装饰器必须返回一个函数,但如果我像上面的代码一样返回函数,那么上下文管理器将如何调用清理函数?
我如何将在装饰器中创建的对象传递给被装饰的函数?如果我像上面的代码一样传递它,我该如何调用被装饰的函数?