#编程实现cache装饰器,import time
import datetime
from functools import wraps
import inspect
defcache(time=5):"""设置最大缓存时间"""
cache_dict ={}
befor =Nonedeflogger(fn):deftime_fn():"""如果fn调用间隔时间>cache设置时间time,则清空cache"""nonlocal befor,cache_dict
nowtime = datetime.datetime.now()ifnot befor:passelif(nowtime-befor).total_seconds()> time:#时间差值超过time值
cache_dict ={}
befor = nowtime
returnNonedefcheck_params(*args,**kwargs):""""识别当前函数调用后,其形参对应值,返回一个元组key"""
kk ={}
values = inspect.signature(fn)
a = values.parameters
lis =list(a.values())for k,v in a.items():
kk[k]=v.default
iflen(args)+len(kwargs)<=len(kk):#位置传参和关键字传参的数量不能超过函数定义数量
s1 =set()if args:#如果收集到位置传参,则更改对应位置的值for i,x inenumerate(args):
kk[lis[i].name]= x
s1.add(lis[i].name)print('位置传参:',s1)if kwargs:#如果收集到关键字传参,并且之前的位置传参与关键字传参不冲突for k1,v1 in kwargs.items():if k1 in s1:raise TypeError('{}() got multiple values for argument {}'.format(fn.__name__,k1))else:
kk[k1]= v1
else:raise TypeError('{}() takes {} positional arguments but {} were given'.format(fn.__name__,len(kk),len(args)+len(kwargs)))
key_ =tuple(kk.items())print('当前key:',key_)return key_
@wraps(fn)defcache_wrapper(*args,**kwargs):"""cache装饰器,将函数调用实参及对应返回值记录于字典"""
time_fn()
key = check_params(*args,**kwargs)
value = cache_dict.get(key)#查找Key是否在cache中if value isNone:
ret = fn(*args,**kwargs)
cache_dict[key]= ret
return ret
else:return value
return cache_wrapper
return logger
@cache(10)# add = cache()(add) -> add = logger(add) -> add(x,y) = cache_wrapper(x,y)defadd(x:int=2,y:int=4,z:int=6)->int:
time.sleep(2)return x + y + z
#base64编码defbase64(string):#生成base64字典#
l1 =['+','/']
base64 ={ k:v for k,v inzip((i for i inrange(64)),(chr(j)for j inrange(65,123)ifnot90< j <=96))}for i inrange(12):
base64[i+52]=str(i)if i <10else l1[i-10]defencode_():#编码
arc =''
b ='00'
l2 =[]for i,v inenumerate(string.encode(),1):
v =bin(v)
arc += v.replace('0b','0'*(8-(len(v)-2)))
div,mod =divmod(i,3)
few =3-mod if mod else0
arc +='00000000'*few
div =(i+few)//3for j inrange(div*4-few):
l2.append(base64[int('00'+arc[6*j:6*(j+1)],base=2)])
l2.extend('='*few)return''.join(l2)return encode_()
ccc ='严'
bbb = 'Man is distinguished,not only by his reason, but by this singular\
passion from other animals, which is a lust of the mind, that by a perseverance\
of delight in the continued and indefatigable generation of knowledge, exceeds the\
short vehemence of any carnal pleasure.'
aaa='($ _ $)'
ddd ='NUxpbDZKQ29JTys4ak9pK3Z1YVNraURsbkxEbWxybGxMZz09'
base64(aaa)