python实现API调用缓存

python实现API调用缓存

  • 1.代码
  • 2.输出
  • 3.保存的json数据

想把python某些函数的参数及返回值记录下来,如果之前已计算过,则直接返回缓存中的数据

1.代码

import jsondef get_variable_name(var):'''变量转变量名'''local_vars=globals()return [name for name, value in local_vars.items() if value is var][0]def quick_exec(func,params):'''通过参数生成UUID,如果缓存中存在则直接获取,否则执行实际的函数,之后保存结果'''cache_path="cache_data.json"records={}uuid="_".join([str(x) for x in params])try:with open(cache_path,"r") as f:records=json.load(f)except:passif uuid in records:ret=records[uuid]["result"]else:ret=func(params)records[uuid]={"result":ret,"params":{}}for var in params:records[uuid]["params"][get_variable_name(var)]=varwith open(cache_path,"w") as f:json.dump(records,f,indent=4)return retdef sdk_api(params):'''实际的调用'''print("sdk_api call in:",params)return sum(params)def l0():globals()['a']=1globals()['b']=2globals()['c']=3globals()['d']=4globals()['e']=5params=(globals()['a'],globals()['b'],globals()['c'],globals()['d'],globals()['e'])ret=quick_exec(lambda x:sdk_api(x),params)print(ret)ret=quick_exec(lambda x:sdk_api(x),params)print(ret)globals()['b']=3params=(a,b,c,d,e)ret=quick_exec(lambda x:sdk_api(x),params)print(ret)ret=quick_exec(lambda x:sdk_api(x),params)print(ret)def l1():l0()def main():l1()
main()

2.输出

# 第一次运行
sdk_api call in: (1, 2, 3, 4, 5)
15
15
sdk_api call in: (1, 3, 3, 4, 5)
16
16
# 第二次运行
15
15
16
16

3.保存的json数据

{"1_2_3_4_5": {"result": 15,"params": {"a": 1,"b": 2,"c": 3,"d": 4,"e": 5}},"1_3_3_4_5": {"result": 16,"params": {"a": 1,"b": 3,"d": 4,"e": 5}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/37416.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

螺旋模型:结合瀑布模型和增量模型的项目管理利器

目录 前言1. 螺旋模型概述1.1 螺旋模型的核心理念1.2 螺旋模型的四个阶段 2. 螺旋模型的详细步骤2.1 计划阶段2.2 风险分析阶段2.3 工程阶段2.4 评估阶段 3. 螺旋模型在大型项目中的应用3.1 应对需求变化3.2 有效的风险管理3.3 增强的客户参与3.4 灵活的资源分配 4. 螺旋模型的…

redis分布式事务

1. 使用RedisTemplate.opsForValue().setIfAbsent(key, value, time, TimeUnit.SECONDS) 这种方法是基于Redis的SET命令的NX(Not eXists)选项和EX(expiry time)选项来实现的。它尝试设置一个键值对,只有当键不存在时才…

git-extras

当使用 git-extras 时,除了安装和基本命令之外,了解如何结合常见的 Git 工作流程和实际开发需求会更加有帮助。下面是一个更全面的 git-extras 使用教程,涵盖了安装、常见命令以及实际应用场景的示例。 1. 安装 git-extras 在 macOS 上&…

Java面试题:讨论单例模式的实现方式,包括懒汉式和饿汉式,并讨论线程安全问题

单例模式(Singleton Pattern)是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。单例模式在某些场景下很有用,例如配置管理、日志记录等。以下是单例模式的两种主要实现方式:懒汉式&#xff08…

【Python】已解决:FileNotFoundError: [Errno 2] No such file or directory: ‘配置信息.csv‘

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:FileNotFoundError: [Errno 2] No such file or directory: ‘配置信息.csv’ 一、分析问题背景 在编写Python代码进行文件操作时,开发者可能会遇到…

备战秋招day7

很高兴又坚持了7天。 算法&#xff08;回溯&#xff09; 77. 组合 class Solution {List<Integer> list new LinkedList<>();List<List<Integer>> llist new LinkedList<>();public List<List<Integer>> combine(int n, int k)…

精品UI知识付费系统源码网站EyouCMS模版源码

这是一款知识付费平台模板&#xff0c;后台可上传本地视频&#xff0c;批量上传视频连接&#xff0c; 视频后台可设计权限观看&#xff0c;免费试看时间时长&#xff0c;会员等级观看&#xff0c;付费观看等功能&#xff0c; 也带软件app权限下载&#xff0c;帮助知识教育和软件…

制造企业的仓库管理如何做好数据分析?

在竞争激烈的现代制造业环境中&#xff0c;仓库管理成为许多生产制造企业面临的一大挑战。随着产品种类的不断增加和客户需求的日一个型号&#xff0c;仓库不仅要处理物料、半成品和成品&#xff0c;还要应对产品更新换代、不同项目客户的特殊需求等复杂因素。面对这些挑战&…

《Windows API每日一练》7.1 计时器基础知识

计时器&#xff08;Timer&#xff09;是一种在编程中用于测量时间间隔的机制。它允许程序在指定的时间间隔内执行特定的操作或触发事件。 本节必须掌握的知识点&#xff1a; 计时器 7.1.1 计时器 我们可以调用SetTimer函数为自己的Windows程序分配一个计时器。SetTimer包含一…

pygame在mobaxterm上无法显示屏幕

在mobaxterm上的linux系统&#xff08;这里测试的是ubuntu系统&#xff09;上运行pygame时&#xff0c;在运行代码 pygame.display.init()展示窗口时会显示pygame.error: windows not available的错误。 这是因为linux下的窗口展示配置与windows不同&#xff0c;windows下按 …

C++实现简化版Qt信号槽机制(2):增加内存安全保障

在上一篇文章中《C实现一个简单的Qt信号槽机制》&#xff0c;我们基于前面的反射代码实现了信号槽的功能。 但是上一篇的代码中没有对象生命周期管理的机制&#xff0c;如果在对象的生命周期结束后还存在未断开的信号和槽连接&#xff0c;那么信号触发时可能会尝试访问已经被析…

ValidateAntiForgeryToken、AntiForgeryToken 防止CSRF(跨网站请求伪造)

用途&#xff1a;防止CSRF&#xff08;跨网站请求伪造&#xff09;。 用法&#xff1a;在View->Form表单中: aspx&#xff1a;<%:Html.AntiForgeryToken()%> razor&#xff1a;Html.AntiForgeryToken() 在Controller->Action动作上&#xff1a;[ValidateAntiForge…

Java的IO体系

目录 1、Java的IO体系2、IO的常用方法3、Java中为什么要分为字节流和字符流4、File和RandomAccessFile5、Java对象的序列化和反序列化6、缓冲流7、Java 的IO流中涉及哪些设计模式 1、Java的IO体系 IO 即为 input 输入 和 output输出 Java的IO体系主要分为字节流和字符流两大类…

java对word文档转图片,转PDF

话不多说&#xff0c;直接入题 先引包 <dependency><groupId>com.luhuiguo</groupId><artifactId>aspose-words</artifactId><version>23.1</version></dependency> word文档转图片 import com.aspose.words.Document; impor…

防爆配电箱航空插头正确安装

防爆配电箱航空插头的安装确实有特殊要求&#xff0c;这些要求旨在确保配电箱在潜在危险环境中的安全运行。以下是一些关键的安装要求&#xff1a; 安装环境&#xff1a;防爆配电箱应安装在危险区域之外的安全地点&#xff0c;远离潜在的爆炸源和危险物质。安装环境应保持干燥、…

springboot使用feign调用不依赖cloud

在使用spring boot调用第三方api中&#xff0c;常用的是okhttp、apache http client等&#xff0c;但是直接使用下来还是有点繁琐&#xff0c;需要手动转换实体。 在springcloud中有个openfeign调用&#xff0c;第一次体验到调用接口还能这么丝滑。注解写道接口上&#xff0c;…

17859划分准则小结

17859《划分准则》 发布时间&#xff1a;1999.9.13 实施时间&#xff1a;2001.1.1 计算机信息系统安全保护能力的五个等级&#xff1a; 第一级&#xff1a;用户自主保护级 第二级…

数据结构简介

在容器的基础之上&#xff0c;java引入了数据结构的概念。数据结构可以简单地理解成是一个以特定的布局方式来存储数据的容器。但是我个人觉得这种理解方式不太合理&#xff0c;根据我们学的数据结构的内容&#xff0c;我更倾向于数据结构是数据在容器中的布局方式&#xff0c;…

rtthread stm32h743的使用(十一)spi设备使用

我们要在rtthread studio 开发环境中建立stm32h743xih6芯片的工程。我们使用一块stm32h743及fpga的核心板完成相关实验&#xff0c;核心板如图&#xff1a; 1.建立新工程&#xff0c;选择相应的芯片型号及debug引脚及调试器 2.编译下载&#xff0c;可以看到串口打印正常 3.…

Python商务数据分析知识专栏(一)——Python编程基础

Python商务数据分析知识专栏&#xff08;一&#xff09;——Python编程基础 一、认识python二、编写python程序三、认识python数据结构四、条件判断及分支语句五、使用def定义函数六、认识面向对象七、读取文件数据八、模块和第三方库专栏一&#xff08;Python基础&#xff09;…