装饰器还为清除或提供
cache_clear()
功能 使缓存无效。
它没有提供有关如何使用cache_clear()
我有两个问题:
cache_clear()
?cache_clear()
调用放入正在缓存的函数中,它会被执行吗?答案 0 :(得分:44)
除了缓存之外,lru_cache
装饰器还会为装饰函数添加新函数 - cache_info
和cache_clear
。下面是一个简单的例子,可以解释它们是如何工作的:
>>> @lru_cache(5)
... def foo():
... print('Executing foo...')
...
>>> foo()
Executing foo...
>>> foo()
>>> foo.cache_info()
CacheInfo(hits=1, misses=1, maxsize=5, currsize=1)
>>> foo.cache_clear()
>>> foo()
Executing foo...
回答你的问题:
如果我在缓存的函数中有条件地放入cache_clear()调用,它会被执行吗?
如果结果尚未缓存,则函数将执行,并根据您的条件执行cache_clear
。我不会使用这样的解决方案 - 一个好的做法是在缓存对象之外使其无效,否则在最坏的情况下根本不会失效,最好的情况下是不可读的代码。
如何从其他函数运行cache_clear()?
只需导入缓存的函数并在其上调用cache_clear
:
from x import foo
def bar():
foo.cache_clear()
答案 1 :(得分:3)
如果您要使缓存过期的方法是一个属性:
class Foo:
@property
@lru_cache()
def bar(self):
return 42
然后您可以通过以下方式清除缓存:
Foo.bar.fget.cache_clear()