import datetime

import inspect

from  inspect import signature,Parameter

def decrode_cache(fn):

##只是装饰器开始的时间

local_cache={}

def wrapper(*agrs, **kwargs):

clear_list= []

for k,(_,stamp) in local_cache.items():  ##此处意思是说 每次只要函数一调用一进来先遍历一次看看之前local_dict的时间戳,在和现在的进行比较

star = datetime.datetime.now().timestamp()

#如果已存在的时间戳和现在比较大于五秒,则清楚缓存(清楚缓存要明确清楚的是字典的key,values值,它是缓存)。

if star - stamp >5:

clear_list.append(k)

for k in clear_list: #这里有一个知识点要注意 字典在遍历的过程中不能移除内容,有需要移除的可以先把他们存在列表里,然后在遍历列表pop字典的值

local_cache.pop(k)

paramers_dict = {} #构建一个装参数的空字典

##考虑 agrs 传参 要求 从参数字典中提取的name = args(按顺序等于) 组成一个k,v字典传给paramers_dict

sig = inspect.signature(fn)

parameters = sig._parameters #OrderedDict([('x', <Parameter "x=1">), ('y', <Parameter "y=2">)])

#从参数字典中提取的name = args(按顺序等于) 组成一个k,v字典

params_name = [key for key in parameters.keys()]

for i,values in enumerate(agrs):

k = params_name[i]

paramers_dict[k] = values

#kwargs 所有值update 到参数字典中

for k,v in kwargs.items():

paramers_dict[k] = v

#缺省值传参方式 add() 如果用缺省值则args kwargs都是空的 那就要把signatue.Paramers字典中的缺省值拿出来加到参数字典中来

for k,v in parameters.items():

if k not in parameters.keys():

parameters[k]= v.default

#三种情况都考虑周全后,该考虑排序问题 也就是要求的 add(x=3,y=4) 和 add(y=4,x=3)的问题

new_paramers_dict = tuple(sorted(parameters)) #变成tuple的原因一方面是不可变位置,另一方面是需要把这个值缓存到本地字典中作为key,key必须是不可hash的值所以只能用元祖包装

if new_paramers_dict  not in local_cache.keys(): ##所有的参数字典都搞定以后就要进行缓存了,缓存其实就是把参数字典写到本地字典中去,第二次输入相同的参数就可以在本地中直接取结果,如果是第一次创建没在本地中就写入。

local_cache[new_paramers_dict] = (fn(*agrs,**kwargs),datetime.datetime.now().timestamp()) ##返回的是参数的解构 构造的是一个{("x"=3,"y"=4):7}的一个字典 前部分是key 是个元祖解构很少见要注意

return local_cache[new_paramers_dict] ### 此处是k,v对创建的时间 也就是函数生成的时间,给此处打一个时间戳,记录他的生命周期的开始,函数再次输入时,这就是成为了过去式。(记住此处的巧妙用法,把时间付给values)

return wrapper

import time

@decrode_cache

def add(x=1,y=2):# args(1,2) kwargs(x=1,x=2) default=()

time.sleep(3)

return x+y

转载于:https://blog.51cto.com/12950054/2172897

缓存装饰器的应用习题练习相关推荐

  1. python 装饰器实现缓存_Python, 这一个缓存装饰器, 其执行流程是怎样的?

    2017/2/6 描述 比如, 考虑这样一段代码, 它的执行流程是怎样的呢 ? class Foo(object): @cached_property def foo(self): # calcula ...

  2. Python之闭包、装饰器及相关习题练习

    学会使用装饰器之前,首先要明白什么是闭包函数 1.闭包 (1)什么是闭包? 闭包:内部函数对外部函数作用域里变量的引用 闭包函数必须满足两个条件:1.函数内部定义的函数 2.包含对外部作用域而非全局作 ...

  3. Python之装饰器

    Python之装饰器 在不修改函数调用方式的前提下,也不能修改函数内部源代码!!!! 例如: 在每个季度公司发绩效,统计每个人的代码执行效率.咱们总不能是每个函数里加time模块吧. import t ...

  4. 装饰器,生成器,迭代器

    文章目录 装饰器 什么是装饰器 为什么使用装饰器 装饰器的使用场景 用户认证,判断用户是否登录 计算函数运行时间(算是一个功能,在项目中用的不多) 记录日志 redis缓存 装饰器1----能够适应9 ...

  5. Python进阶: Decorator 装饰器你太美

    函数 -> 装饰器 函数的4个核心概念 1.函数可以赋与变量 def func(message):print('Got a message: {}'.format(message))send_m ...

  6. python中的装饰器(以及多个装饰器详细执行过程)

    装饰器 1.如果要增强一个函数的功能,但又不希望更改原函数中的代码,这种在代码运行期间动态增加功能的机制被称为装饰器   [Decorator] 2. 本质:实际上就是一个闭包,只不过被装饰的函数需要 ...

  7. python3.7用法_Python 3.7中dataclass装饰器用法详解

    Python 3.7的dataclass装饰器用法 Python 3.7新功能之dataclass装饰器详解 前言 Python 3.7 将于今年夏天发布,Python 3.7 中将会有许多新东西: ...

  8. python高级语法装饰器_Python高级编程——装饰器Decorator超详细讲解上

    Python高级编程--装饰器Decorator超详细讲解(上篇) 送你小心心记得关注我哦!! 进入正文 全文摘要 装饰器decorator,是python语言的重要特性,我们平时都会遇到,无论是面向 ...

  9. Python 装饰器详解(上)

    Python 装饰器详解(上) 转自:https://blog.csdn.net/qq_27825451/article/details/84396970,博主仅对其中 demo 实现中不适合pyth ...

最新文章

  1. 两种比较不错的密码修改方案
  2. string中c_str()、data()、copy(p,n)函数的用法
  3. jms.jar 2.0_JMS API概述:JMS 1.x和JMS 2.x
  4. 7.生产者消费者 案例 (使用Lock 同步锁 方式,使用Condition完成线程之间的通信)...
  5. springboot1.5 和 2.0 引入 redis 并封装工具类
  6. BZOJ 1100 luogu 3454(计算几何+KMP)
  7. 【Android系统源码修改】去掉开机时显示的正在优化应用对话框
  8. python 百度ai json解析_百度AI接口调用
  9. 中国首个数字化糖尿病逆转项目在宁波正式启动
  10. 世界上前11名最贵跑车
  11. 论文阅读学习 - 深度学习网络模型分析对比
  12. hadoop心跳机制解析
  13. 目录中的pwd、cd及ls命令
  14. 全球与中国老年人代步车市场深度研究分析报告
  15. 塔望食业洞察|预制菜行业市场现状、发展趋势及未来思考
  16. 【LeetCode - 702】搜索长度未知的有序数组
  17. php5.6 dbase,dBase数据库
  18. 【表格样式】——HTML制作表格大全
  19. 【linux】持续集成与持续发布CICD
  20. 什么软件能打开prt文件_PRT文件扩展名 - 什么是.prt以及如何打开? - ReviverSoft...

热门文章

  1. Akka与设备组一起工作《twelve》译
  2. C#实现拖放获取文件路径
  3. 学习Web前端,前景无限光明?
  4. 记一次axios源码排查
  5. loj10131 暗的连锁
  6. 特朗普网络安全行政令实施情况如何?
  7. 3D脚本 maxscript入门教程(7)
  8. zendstudio的安装与配置
  9. HEL上清除Oracle10g clusterware的失败安装
  10. UIView 移除子视图