У меня есть тестовый класс, который требует очистки в конце. Чтобы убедиться, что пользователь не забудет это сделать, я хочу добавить в класс контекстный менеджер. У меня также есть декоратор, внутри которого я хочу использовать этот менеджер контекста, чтобы создать объект тестового класса и передать его декорированной функции. Это вообще возможно?
Вот что я хочу сделать:
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
обеспечивает вызов функции очистки.
Итак, есть два вопроса:
Как мне использовать контекстный менеджер внутри декоратора, из того, что я знаю, декоратор должен возвращать функцию, но если я верну функцию (как в коде выше), как контекстный менеджер вызовет очистку?
Как передать объект, созданный в декораторе, в декоративную функцию, если я передам его, как в приведенном выше коде, как мне вызвать декорированную функцию?