Доступ к значению переменной из декоратора после выполнения декорированной функции - PullRequest
0 голосов
/ 30 апреля 2020

def memoize(fn):
    memory=dict()
    def inner(inpt):
        if not inpt in memory:
            memory[inpt] = fn(inpt)
        return memory[inpt]
    return inner

@memoize
def expected_rounds(picks_to_go):
    #algorithm....
    ans += expected_rounds(new_picks_to_go) #some recursion
    #algorithm....
    return ans

Как получить доступ (и даже распечатать) к переменной memory в memoize декораторе после того, как функция успешно завершит выполнение и вернет ответ?

1 Ответ

0 голосов
/ 30 апреля 2020

моя идея, которую я создал после публикации вопроса, использует класс, но я бы хотел остаться с функцией decorator:

#class callable that can be used as decorator
class Memoize:
    def __init__(self):
        self.memory = {}
#         self.fn = None

    def set_fn(self, fn):
        self.fn = fn
        return self # this line is important

    def __call__(self, *args):
        if args not in self.memo:
            self.memory[args] = self.fn(*args)
        return self.memory[args]

memo1 = Memoize()

@memo1.set_fn
def expected_rounds(picks_to_go):
    #something
    return ans

expected_rounds(some_input)

memo1.memory # <- access to memory possible

...