python dict key expire_自定义一个cache函数,实现过期清除key的功能(python实现)

本文介绍了如何使用Python自定义一个缓存装饰器`cache`,该装饰器带有过期清除功能,能自动移除超过5秒未使用的key。通过`inspect`获取函数签名,`datetime`计算时间戳来判断key是否过期。
摘要由CSDN通过智能技术生成

版权声明:博文千万条,版权第一条。转载不规范,博主两行泪https://blog.csdn.net/Leeeey/article/details/89511940

自定义一个cache函数,实现过期清除key的功能(5秒)

import inspect

from functools import wraps

import time

import datetime

def cache(fn):

local_cache = {} # 对不同函数名是不同的cache

@wraps(fn)

def wrapper(*args, **kwargs):

def _clear_expire():

# 清除缓存:注意:在对字典迭代的时候,是不能删除的!

expire_keys = []

# for k, v in local_cache.items(): # {(('x', 4), ('y', 5)): (9, 1535638337.355427)}

# ret, stamp = v

# 等价

for k,(_,stamp) in local_cache.items():

if datetime.datetime.now().timestamp() - stamp > 5:

expire_keys.append(k)

for k in expire_keys:

local_cache.pop(k)

# 每次都要遍历,最好用线程,用的时候清除

def _make_key(args,kwargs):

sig = inspect.signature(fn) # 获取签名 (x=4, y=5)

params = sig.parameters # 获取参数字典,有序的 OrderedDict([('x', ), ('y', )])

values = list(params.values()) # 有序的 [, ]

keys = list(params.keys()) # ['x', 'y']

param_dic = {} # c参数字典

# 位置传参

for k, v in enumerate(args):

param_dic[keys[k]] = v

param_dic.update(zip(params.keys(), args)) # 二元组,放到字典中,形成 k-v对

# 关键字传参

param_dic.update(kwargs) # 关键字参数,放到字典中

# 缺省值

for k, v in params.items(): # OrderedDict([('x', ), ('y', )])

if k not in param_dic:

param_dic[k] = v.default

key = tuple(sorted(param_dic.items())) # sorted生成列表,不能做key,所以tuple一下(key必须是可hash的,因为要用字典) (('x', 4), ('y', 5))

return key

_clear_expire()

key = _make_key(args,kwargs)

if key not in local_cache.keys():

local_cache[key] = fn(*args, **kwargs), datetime.datetime.now().timestamp() # 放到二元组中,记录的是缓存的时间

# 形成一个 {key:stamp}的字典

#如果说到点清除,最好写结束时间,到点清除,记录一个未来时间

print(local_cache) # {(('x', 4), ('y', 5)): (9, 1535638337.355427)}

# print(local_cache[key])

return local_cache[key]

return wrapper

@cache

def add(x,y):

return x+y

add(4,5)

time.sleep(5)

add(4,y=5)

time.sleep(5)

add(x=4,y=5)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值