装饰器:实现一个cache装饰器,可实现过期自动清除功能

实现cache装饰器
from functools import wraps
import time
import inspect
import datetime

def func_cache(fn):
    local_cache = {} #根据函数名定义不同的cache
    @wraps(fn)
    def wrapper(*args,**kwargs): #接收各种参数
        print("传入参数: ",args,kwargs)
        
        # 参数处理,构建key
        key_dict = {}
        sig = inspect.signature(fn)
        params = sig.parameters #有序字典
        print("params: ",params)
        
        patam_list = list(params.keys())
        
        # 位置参数
        for i,v in enumerate(args):
            # print(i,v)
            k = patam_list[i]
            key_dict[k] = v
            
        # 关键字参数
        # for k,v in kwargs.items():
        #     key_dict[k]=v
        key_dict.update(kwargs)
        
        # 缺省值处理
        for k in params.keys():
            if k not in key_dict.keys():
                print("default: ",params[k].default)
                key_dict[k] = params[k].default
        
        key = tuple(sorted(key_dict.items()))
        
        if key not in local_cache.keys():
            ret = fn(*args,**kwargs)
            local_cache[key] = ret
            
        return local_cache[key]
    return wrapper


# 增加一个装饰器,查看函数执行时间
def logger(fn):
    @wraps(fn)
    def wrapper(*args,**kwargs):
        start = datetime.datetime.now()
        ret = fn(*args,**kwargs)
        delta = (datetime.datetime.now()-start).total_seconds()
        print("spand time: {}秒".format(delta))
        print("=="*20)
        return ret
    return wrapper

@logger
@func_cache
def add(x,y=5):
    time.sleep(3)
    ret = x+y
    print("result: ",ret)
    return ret

add(4,5)
add(4)
add(4,y=5)
add(x=4,y=5)
add(y=5,x=4)

在这里插入图片描述

实现过期清除

from functools import wraps
import time
import inspect
import datetime

def func_cache(duration):
    def _cache(fn):
        local_cache = {} #根据函数名定义不同的cache
        @wraps(fn)
        def wrapper(*args,**kwargs): #接收各种参数
            print("传入参数: ",args,kwargs)
            
            # 判断local_cache中有没有过期的key(设定过期时间为5s)
            expire_keys = []
            for k,(_,ts) in local_cache.items():
                if datetime.datetime.now().timestamp()-ts > duration:
                    expire_keys.append(k)
            for k in expire_keys:
                local_cache.pop(k)
            
            # 参数处理,构建key
            key_dict = {}
            sig = inspect.signature(fn)
            params = sig.parameters #有序字典
            print("params: ",params)
            
            patam_list = list(params.keys())
            
            # 位置参数
            for i,v in enumerate(args):
                # print(i,v)
                k = patam_list[i]
                key_dict[k] = v
                
            # 关键字参数
            # for k,v in kwargs.items():
            #     key_dict[k]=v
            key_dict.update(kwargs)
            
            # 缺省值处理
            for k in params.keys():
                if k not in key_dict.keys():
                    print("default: ",params[k].default)
                    key_dict[k] = params[k].default
            
            key = tuple(sorted(key_dict.items()))
            
            if key not in local_cache.keys():
                ret = fn(*args,**kwargs)
                local_cache[key] = (ret,datetime.datetime.now().timestamp())
                
            return local_cache[key]
        return wrapper
    return _cache


# 增加一个装饰器,查看函数执行时间
def logger(fn):
    @wraps(fn)
    def wrapper(*args,**kwargs):
        start = datetime.datetime.now()
        ret = fn(*args,**kwargs)
        delta = (datetime.datetime.now()-start).total_seconds()
        print("spand time: {}秒".format(delta))
        print("=="*20)
        return ret
    return wrapper

@logger
@func_cache(5)
def add(x,y=5):
    time.sleep(3)
    ret = x+y
    print("result: ",ret)
    return ret

add(4,5)
add(4)
add(4,y=5)
add(x=4,y=5)
add(y=5,x=4)
print('---'*20)
time.sleep(6)
add(4,5)
add(4)


在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jepson2017

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值