Имам тестов клас, който изисква да направя малко почистване в края. За да съм сигурен, че потребителят няма да забрави да направи това, искам да добавя контекстен мениджър към класа. Имам и декоратор, вътре в който искам да използвам този контекстен мениджър, за да създам обект от тестов клас и да го предам на декорираната функция. Възможно ли е изобщо?
Ето какво искам да направя:
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
гарантира, че функцията за почистване е извикана.
Така че има два въпроса:
Как да използвам контекстен мениджър вътре в декоратор, от това, което знам, че декораторът трябва да върне функция, но ако върна функцията (както в кода по-горе), как контекстният мениджър ще извика почистване?
Как да предам обект, създаден в декоратор, към украсената функция, ако го предам като в горния код, как ще извикам украсената функция?