我有一個簡單的小修飾器,它將函數調用中的函數作爲函數屬性緩存在dict
中。重新分配函數屬性使其'不可達'
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)
我現在想添加清空緩存的可能性。所以我改變dynamic_programming()
功能是這樣的:
def dynamic_programming(f):
f.cache = {}
def clear():
f.cache = {}
f.clear = clear
return decorator(_dynamic_programming, f)
現在讓我們假設我用這個小東西,以實現一個斐波那契數函數:
@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}
但現在當我清除緩存奇怪的事情發生了:
>>> fib.clear()
>>> fib.cache
{(0,): 1, (1,): 1, (2,): 2, (3,): 3, (4,): 5}
或(有一個新的Python內核運行)這樣做反過來:
>>> fib.clear()
>>> fib(4)
5
>>> fib.cache
{}
爲什麼緩存莫名其妙不是第一次訪問之後「到達」呼叫來電或clear()
後一個電話後clear()
時,即不改變?
(順便說一句,我知道了解決正確清除緩存:調用f.cache.clear()
,而不是分配給{}
它的工作如預期,我在原因爲什麼分配解決方案失敗僅僅是感興趣。)
我最長的職位尚未對SO ,由它的外觀... :) – matsjoyce 2014-10-29 17:15:47