Ho un semplice decoratore, che memorizza i risultati delle chiamate di funzione in un dict
come attributo di funzione.Riassegna un attributo di funzione lo rende "irraggiungibile"
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)
Ora desidero aggiungere la possibilità di svuotare la cache. Così a cambiare la funzione dynamic_programming()
in questo modo:
def dynamic_programming(f):
f.cache = {}
def clear():
f.cache = {}
f.clear = clear
return decorator(_dynamic_programming, f)
Ora supponiamo che uso questa piccola cosa per implementare una funzione numero di Fibonacci:
@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}
Ma ora quando svuotare la cache qualcosa di strano succede:
>>> fib.clear()
>>> fib.cache
{(0,): 1, (1,): 1, (2,): 2, (3,): 3, (4,): 5}
Or (con un nuovo kernel Python in esecuzione) fanno il contrario:
Perché la cache in qualche modo non è "raggiungibile" dopo il primo accesso ad essa, vale a dire non cambia quando si chiama clear()
dopo una chiamata o una chiamata dopo un clear()
?
(. Btw So che una soluzione per cancellare la cache in modo corretto:. Chiamando f.cache.clear()
invece di assegnare {}
ad esso funziona come previsto Sto semplicemente interessato al ragione perché la soluzione assegnazione non riesce.)
Il mio più lunga dopo ancora su SO , per l'aspetto di esso ... :) – matsjoyce