装饰器缓存
对于函数参数类型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之后一起打印