如何使用@functools.ru_cache decorator绕过函数



希望你一切顺利!

我使用的函数正在使用functools库的lru_cache。例如:

@functools.lru_cache(maxsize=pow(2,13))
def get_id(word):
# retrieving id, using cache if possible

在某些情况下,我希望绕过缓存,从而直接从源获取ID,但我不想创建两个运行完全相同代码的独立函数(一个有缓存,另一个没有(。阅读docs.python上functools的文档,我知道可以绕过缓存:

可以通过包装的属性访问原始底层函数。这对于内省、绕过高速缓存是有用的,或者用于用不同的高速缓存重写函数。

我曾尝试使用包装函数来执行此操作,但由于内部函数仅在外部函数运行时存在,因此每次调用时都会重置缓存。

如果能在这件事上得到任何帮助,我将不胜感激。

文档告诉您的是,您可以通过这种方式直接访问封装的函数(绕过缓存(:

get_id.__wrapped__(word="hello")

您可以添加一个带有标志的附加层:

from functools import lru_cache
@lru_cache(maxsize=pow(2, 13))
def get_cached(word):
return get_raw(word)
def get_raw(word):
# your logic goes here...
pass
def get_id(word, cached=True):
if cached:
return get_cached(word)
else:
return get_raw(word)

最新更新