我对一个应用程序接口进行了很多多余的调用,所以我决定使用lru_cache。但是,我也希望经常清除缓存,以防给定输入的响应值发生变化。因此,作为一种解决方案,我创建了自己的装饰器,以便每隔一段时间清除缓存,但现在我的函数api_call()似乎总是返回None。下面是我的代码:
def cache_maintainer(clear_time: int):
"""
A function decorator that clears lru_cache clear_time seconds
:param clear_time: In seconds, how often to clear cache (only checks when called)
"""
def inner(func):
def wrapper(*args, **kwargs):
if hasattr(func, 'next_clear'):
if time.time() > func.next_clear:
func.cache_clear()
func.next_clear = time.time() + clear_time
else:
func.next_clear = time.time() + clear_time
func(*args, **kwargs)
return wrapper
return inner
@cache_maintainer(86400) # clear cache every 1 day
@lru_cache(maxsize=1000)
def api_call(param):
return param
print(api_call("test"))我无论如何也找不出我做错了什么
发布于 2020-07-11 07:48:50
这个答案是使用python包- cachetools
安装cachetools pip install cachetools
from cachetools import TTLCache
cache = TTLCache(maxsize=5, ttl=100)
cache['dog'] = 'dog'
a = cache['dog'] # dog
... after 100 seconds...
cache['dog']
KeyError exception thrown发布于 2020-07-11 07:53:08
非常简单的错误,花了太长时间才弄清楚。正如Tim Peters提到的,func()被调用,但结果被丢弃(face palm)。我所需要做的就是在调用func()的地方添加一个返回值,它就像我所期望的那样工作。以下是修改后的正常工作代码:
def cache_maintainer(clear_time: int):
"""
A function decorator that clears lru_cache clear_time seconds
:param clear_time: In seconds, how often to clear cache (only checks when called)
"""
def inner(func):
def wrapper(*args, **kwargs):
if hasattr(func, 'next_clear'):
if time.time() > func.next_clear:
func.cache_clear()
func.next_clear = time.time() + clear_time
else:
func.next_clear = time.time() + clear_time
return func(*args, **kwargs)
return wrapper
return inner
@cache_maintainer(86400) # clear cache every 1 day
@lru_cache(maxsize=1000)
def api_call(param):
return param
print(api_call("test"))https://stackoverflow.com/questions/62843699
复制相似问题