from functools import wraps
import time
import inspect
import datetime
def n_cache(fn):
local_cache = {}
@wraps(fn)
def wrapper(*args,**kwargs):
print(args,kwargs)
key_dict = {}
sig=inspect.signature(fn)
od = sig.parameters #有序字典
param_list = list(od.keys())
#位置参数
for i,x in enumerate(args):
k=param_list[i]
key_dict[k]= x
key_dict.update(kwargs)
print(key_dict.items())
#缺省值
print(od.keys(),"def")
for k in od.keys():
if k not in key_dict.keys():
key_dict[k]=od[k].default
key=tuple(sorted(key_dict.items()))
print(tuple(sorted(key_dict.items())))
#for k,v in kwargs.items():
# key_dict[k]=v
if key not in local_cache.keys():
res = fn(*args,**kwargs)
local_cache[key]=res
print(local_cache)
return local_cache[key]
return wrapper
def logger(fn):
@wraps(fn)
def wrapper(*args,**kwargs):
start = datetime.datetime.now()
res = fn(*args,**kwargs)
delte = datetime.datetime.now()-start
delte = delte.total_seconds()
print("执行时间",delte)
return res
return wrapper
@logger
@n_cache
def add(x,y=1):
time.sleep(3)
return x+y
缓存过期功能
from functools import wraps
import time
import inspect
import datetime
def n_cache(fn):
local_cache = {}
@wraps(fn)
def wrapper(*args,**kwargs):
delkey = []
print(local_cache)
for k,(v,ts) in local_cache.items():
if datetime.datetime.now().timestamp()-ts >5: #5秒过期
delkey.append(k)
for k in delkey:
local_cache.pop(k)
print(args,kwargs)
key_dict = {}
sig=inspect.signature(fn)
od = sig.parameters #有序字典
param_list = list(od.keys())
#位置参数
for i,x in enumerate(args):
k=param_list[i]
key_dict[k]= x
key_dict.update(kwargs)
print(key_dict.items())
#缺省值
print(od.keys(),"def")
for k in od.keys():
if k not in key_dict.keys():
key_dict[k]=od[k].default
key=tuple(sorted(key_dict.items()))
print(tuple(sorted(key_dict.items())))
#for k,v in kwargs.items():
# key_dict[k]=v
if key not in local_cache.keys():
res = fn(*args,**kwargs),datetime.datetime.now().timestamp()
local_cache[key]=res
print(local_cache)
return local_cache[key][0]
return wrapper
def logger(fn):
@wraps(fn)
def wrapper(*args,**kwargs):
start = datetime.datetime.now()
res = fn(*args,**kwargs)
delte = datetime.datetime.now()-start
delte = delte.total_seconds()
print("执行时间",delte)
return res
return wrapper
@logger
@n_cache
def add(x,y=1):
time.sleep(3)
return x+y