【发布时间】:2014-10-29 16:45:28
【问题描述】:
我有一个简单的小装饰器,它将函数调用的结果缓存在 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() 而不是为其分配 {} 按预期工作。我只是对分配的原因感兴趣原因解决方案失败。)
【问题讨论】:
标签: python function-attributes