Python 可选的函数缓存
Python 可选的函数缓存
在Python中,缓存一个具有可选缓存参数的函数的最佳方法是什么?
我有一个函数,执行数据库请求并不需要任何参数。大多数情况下,如果函数使用缓存结果,那么它是没问题的,但有时我想发送一个新的数据库请求。
from functools import lru_cache @lru_cache def my_database_request_function(use_cache: bool = False): if use_cache: # takes response from cache else: # makes database request return response
上述实现无法正常工作,因为第二次调用函数时,使用use_cache=False参数,它不会发出新的请求。
admin 更改状态以发布 2023年5月24日
from multipledispatch import dispatch from functools import lru_cache @dispatch(bool) @lru_cache def my_database_request_function(use_cache: bool): print('cached') @dispatch() def my_database_request_function(): print('NOT cached') my_database_request_function(True) my_database_request_function(False) my_database_request_function()
输出:
cached cached NOT cached
使用一个叫做multipledispatch的模块,你可以进行函数重载,即在有多个同名函数的情况下,你可以为每个函数指定不同的参数。这里的bool可以更改为任何你喜欢的东西。
使用 lru_cache 的 cache_clear()
清除缓存值并强制重新获取:
[...] 这个装饰器还提供了一个
cache_clear()
函数来清除或无效化缓存。[...]
示例:
from functools import lru_cache what = 1 # global value for demo purposes @lru_cache def my_database_request_function(): return what print(my_database_request_function()) what = 42 # change value print(my_database_request_function()) # gets cached value my_database_request_function.cache_clear() # clear cache print(my_database_request_function()) # not cached
输出:
1 1 # after changing the global 'what' variable, still gets cached result 42 # after .cache_clear()