Python:如何忽略functools.lru\u缓存?

2024-09-28 21:50:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我要缓存的函数类似于:

def a(x, time='last'):

我对每个a(x,y)都有确定性行为,除了y=='last'时。因此,当调用a(x, 'last')时,我想调用“real-thing”和一个lru\u缓存函数来处理其他所有问题。在

我想我自己的装修师可以做到:

^{pr2}$

我完全错了吗?这怎么可能?在


Tags: 函数timedefreallastthinglrupr2
2条回答

将函数包装在lru_cache()中,然后在顶部添加修饰符并通过__wrapped__属性访问原始的未缓存函数,或者更好的方法是使用^{} function来剥离任意数量的装饰器的函数:

from functools import wraps
from inspect import unwrap

def bypass_cache_last_time(func):
    @wraps(func)
    def function_wrapper(*args, **kwargs):
        if not 'time' in kwargs or kwargs['time'] == 'last':
            # Bypass any additional decorators and call function directly
            return unwrap(func)(*args, **kwargs)
        else:
            return func(*args, **kwargs)

        return function_wrapper

把这个当作

^{pr2}$

functools.wraps()装饰器设置包装器上的__wrapped__属性时,functools.wraps()再次向前传递展开装饰器的能力。在

或者让您的decorator应用lru_cache()修饰符本身,并在装饰时保留原始函数的副本:

def my_lru_cache(func):
    cached = lru_cache()(func)

    @wraps(func)
    def function_wrapper(*args, **kwargs):
        if not 'time' in kwargs or kwargs['time'] == 'last':
            # call the function directly
            return func(*args, **kwargs)
        else:
            # use the lru_cache-wrapped version
            return cached(*args, **kwargs)

    return function_wrapper

将此用作

@my_lru_cache
def some_function(x, time='last'):
    # ...

您可以直接调用lru_cache()来使用lru_cache(<args>)(func)获得{}的“包装”版本。然后您可以从包装中返回:

def my_lru_cache(func):
    caching_func = lru_cache()(func)
    def function_wrapper(*args, **kwargs):        
        if kwargs.get('time') == 'last':
            return func(*args, **kwargs)
        return caching_func(*args, **kwargs)
    return function_wrapper

相关问题 更多 >