Python 3.x 如何使用@functools.lru\u缓存装饰器绕过函数

Python 3.x 如何使用@functools.lru\u缓存装饰器绕过函数,python-3.x,caching,Python 3.x,Caching,希望你做得很好 我使用的函数使用functools库的lru_缓存。例如: @functools.lru_cache(maxsize=pow(2,13)) def get_id(word): # retrieving id, using cache if possible 在某些情况下,我希望绕过缓存,从而直接从源代码获取ID, 但我不想创建两个运行完全相同代码的单独函数(一个带缓存,另一个不带缓存)。 阅读docs.python上functools的文档后,我了解到可以绕过缓存: 原

希望你做得很好

我使用的函数使用functools库的lru_缓存。例如:

@functools.lru_cache(maxsize=pow(2,13))
def get_id(word):
    # retrieving id, using cache if possible
在某些情况下,我希望绕过缓存,从而直接从源代码获取ID, 但我不想创建两个运行完全相同代码的单独函数(一个带缓存,另一个不带缓存)。 阅读docs.python上functools的文档后,我了解到可以绕过缓存:

原始的基础函数可以通过包装的 属性这对于内省、绕过缓存非常有用, 或者使用不同的缓存重写函数

我曾尝试使用包装器函数来实现这一点,但由于内部函数仅在外部函数运行时才存在,因此每次调用时都会重置缓存


如果您能在这方面提供帮助,我将不胜感激。

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


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

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.uu wrapped_u(参数),但是由于函数是类方法的一部分,所以参数是“self”,我忘记了,因此我认为我没有使用。u wrapped_u属性。
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)