如何在python @ functools.lru_cache上使用cache_clear()

时间:2016-06-06 09:23:35

标签: python python-3.x

The documentation州:

  

装饰器还为清除或提供cache_clear()功能   使缓存无效。

它没有提供有关如何使用cache_clear()

的任何示例或指导

我有两个问题:

  • 如何从其他功能运行cache_clear()
  • 如果我有条件地将cache_clear()调用放入正在缓存的函数中,它会被执行吗?

2 个答案:

答案 0 :(得分:44)

除了缓存之外,lru_cache装饰器还会为装饰函数添加新函数 - cache_infocache_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()

查看此答案:https://stackoverflow.com/a/55497384/8953378