Как почистить (сбросить) кеш-память моего декоратора? - PullRequest
1 голос
/ 30 октября 2019

Мне нужно написать декоратор, чтобы запомнить результаты функции для заданных параметров. Я сделал это, но как сбросить память? Я попытался сбросить func.cache, но без правильного результата.

from random import random

    def cached(func):
        cache = func.cache = {}
        func.call_num = 0
        func.eval_num = 0
        def memorised_func(*args, **kwargs):
            key = str(args) + str(sorted(kwargs.items(), key=lambda kv: kv[1]))
            #print(key)
            if key not in cache:
                cache[key] = func(*args, **kwargs)
                func.eval_num += 1
            func.call_num += 1
            print(func.call_num, func.eval_num)
            return cache[key]
        memorised_func.cache_status = lambda: print(f"Function {func.__name__} called {func.call_num} times, evaluated {func.eval_num} times")
        #memorised_func.cache_reset = lambda : func.cache #-TODO , help
        return memorised_func

    @cached
    def foo(x, y=1, z=4):
        return random()

    #EXAMPLE THAT SHOULD WORK    
    print(foo(3) == foo(3))
    print(foo(4) == foo(4))
    print(foo(3, z=-1, y=3) == foo(3, y=3, z=-1))
    print(foo(3) != foo(x=3))
    a = foo(3)
    foo.cache_reset() #HERE DOESN'T WORK - TODO
    print(a != foo(3))
    print(foo.cache_status() == 'Function foo called 10 times, evaluated 5 times')

1 Ответ

2 голосов
/ 30 октября 2019

закомментированный раздел просто:

memorised_func.cache_reset  = lambda: func.cache.clear()

У вас есть сильный кроссовер с memoize из библиотеки func, подумайте и об этом.

...