python实现API调用缓存

python实现API调用缓存

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

1.代码

python 复制代码
import json

def 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:
        pass
    if 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)]=var
    with open(cache_path,"w") as f:
        json.dump(records,f,indent=4)
    return ret

def sdk_api(params):
    '''实际的调用'''
    print("sdk_api call in:",params)
    return sum(params)

def l0():
    globals()['a']=1
    globals()['b']=2
    globals()['c']=3
    globals()['d']=4
    globals()['e']=5
    params=(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']=3
    params=(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.输出

bash 复制代码
# 第一次运行
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数据

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
        }
    }
}
相关推荐
小江的记录本8 小时前
【JVM虚拟机】垃圾回收GC:四种引用类型:强引用、软引用、弱引用、虚引用(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·后端·python·spring·面试
APIshop8 小时前
Python 获取 1688 商品采集 API 接口 | 工厂货源自动化对接商品信息 | 无需选品
运维·python·自动化
deepin_sir8 小时前
10 - 函数
开发语言·python
charlee449 小时前
《GIS基础原理与技术实践》配套案例(Python版)
python·conda·numpy·gis·环境配置
枫叶林FYL9 小时前
项目十:事件溯源仓储管理系统(WMS)仿真实现
开发语言·python
渣渣xiong12 小时前
从零开始:前端转型AI agent直到就业第五十七天-第五十八天
前端·人工智能·python
小L~~~12 小时前
基于贪心策略的混合遗传算法求解01背包问题
python·算法
才兄说13 小时前
机器人二次开发机器人动作定制?动作迁移数据优化
python
用户83562907805113 小时前
用 Python 实现 Excel 散点图绘制与定制
后端·python
PAK向日葵13 小时前
从零实现 Python 虚拟机(一):PVM 基本原理介绍
python