Ответ 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()