装饰器缓存
对于函数参数类型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之后一起打印 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号