装饰器缓存

对于函数参数类型def(x,y,z)或者def(x,y,**kwargs)或者def(*args)这样类型的函数,缓存装饰器这样写:

# 实现一个cache装饰器

import inspect,time

def cache(fn):
    local_cache = {}  # 缓存的key 元组 value 返回值
    def wrapper(*args,**kwargs):
        # make_key
        key = tuple()
        sig = inspect.signature(fn)
        params = sig.parameters
        keys = params.keys()
        values = params.values()

        for i,val in enumerate(args):
            key += (tuple(keys)[i],val)# ('x',4,'y',5)

        for item in sorted(kwargs.items()):
            key += item #('x',4,'y',5,'z',6)

        if key not in local_cache.keys():
            local_cache[key] = fn(*args,**kwargs)
        return local_cache[key]
    return wrapper

@cache
def add(x,y,z):
    time.sleep(3)
    return x + y + z


@cache
def add1(x,*args):
    sum = 0
    time.sleep(3)
    for i in args:
        sum += i
    return sum + x


print(add(3, 4, 5))#这几个缓存了,sleep之后一起打印
print(add(3, 4, z = 5))#这几个缓存了,sleep之后一起打印
print(add(3, y = 4, z = 5))#这几个缓存了,sleep之后一起打印
posted @ 2022-05-08 11:54  千焱  阅读(37)  评论(0编辑  收藏  举报