如何使用@functools.lru_cache装饰器绕过函数?

4

希望你一切都好!

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

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

有时我希望绕过缓存,直接从源代码获取ID,但我不想创建两个完全相同的函数(一个有缓存,另一个没有)。根据docs.python上functools的文档,了解到可以绕过缓存: “原始基础函数可通过wrapped属性访问。这对于内省、绕过缓存或使用不同缓存重新包装函数很有用。” 我尝试使用包装函数实现此功能,但由于内部函数仅在外部函数运行时存在,因此每次调用都会重置缓存。希望能得到任何有关此事的帮助。
1个回答

4
文档告诉你的是,你可以通过这种方式直接访问包装函数(绕过缓存):
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)

谢谢,我实际上尝试使用get_id.wrapped(parameters),但由于该函数是类方法的一部分,其中一个参数是“self”,我忘记了这一点,因此让我认为我没有正确使用.__wrapped__属性。 - Joshua

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接