Как использовать cache_clear() для python @functools.lru_cache

В документации указано:

Декоратор также предоставляет функцию cache_clear() для очистки или аннулирование кеша.

В нем нет примеров или рекомендаций по использованию cache_clear()

У меня есть два вопроса:

  • Как запустить cache_clear() из другой функции?
  • Если я помещаю вызов cache_clear() условно внутри функции, которая кэшируется, будет ли она когда-либо выполняться?

Ответ 1

Помимо кеширования, декоратор 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()