Mam prosty mały dekorator, który buforuje wyniki z wywołań funkcji w dict
jako atrybut funkcji.Przypisanie atrybutu funkcji powoduje, że jest on niedostępny.
from decorator import decorator
def _dynamic_programming(f, *args, **kwargs):
try:
f.cache[args]
except KeyError:
f.cache[args] = f(*args, **kwargs)
return f.cache[args]
def dynamic_programming(f):
f.cache = {}
return decorator(_dynamic_programming, f)
Chcę teraz dodać możliwość opróżnienia pamięci podręcznej. Więc zmienić funkcję dynamic_programming()
tak:
def dynamic_programming(f):
f.cache = {}
def clear():
f.cache = {}
f.clear = clear
return decorator(_dynamic_programming, f)
Teraz załóżmy Używam tego drobiazg do realizacji funkcji liczb Fibonacciego:
@dynamic_programming
def fib(n):
if n <= 1:
return 1
else:
return fib(n-1) + fib(n-2)
>>> fib(4)
5
>>> fib.cache
{(0,): 1, (1,): 1, (2,): 2, (3,): 3, (4,): 5}
ale teraz kiedy wyczyścić coś cache dziwnego się dzieje:
>>> fib.clear()
>>> fib.cache
{(0,): 1, (1,): 1, (2,): 2, (3,): 3, (4,): 5}
Albo (z nowym działającego jądra Python) zrobić to na odwrót:
>>> fib.clear()
>>> fib(4)
5
>>> fib.cache
{}
Dlaczego nie jest cache jakoś „osiągalny” po pierwszym dostępu do niej, to znaczy nie zmieniając przy wywołaniu clear()
Po rozmowy lub połączenia po clear()
?
(. Btw wiem rozwiązanie poprawnie wyczyścić pamięć podręczną. Nazywając f.cache.clear()
zamiast przypisywania {}
aby to działa zgodnie z oczekiwaniami Jestem zainteresowany jedynie w powodu dlaczego rozwiązanie przypisanie zawiedzie.)
Mój najdłuższy słupek jeszcze na SO , przez wygląd tego ... :) – matsjoyce