从0开始python学习-47.pytest框架之解决Template替换无法进行二次处理的问题之热加载

问题:当参数为动态参数时,Template替换无法进行二次处理

解决方案:通过热加载来进行替换

热加载原理:在代码运行的过程中动态的调用python中的方法达到获得动态参数

可以进行热加载的情况:yaml文件,随机数,替换后的值进行计算,加密等

示例:

需要热加载的数据:

yaml数据:extract.yaml

python 复制代码
token: 76_ZgYcDxWFgCCjZVj2EPfqj7QWW_k3-iUZq68Mr6hE_VvDDa_IAfjEIi7nQwMUoISer8MAspesP1JnP1iIziezVPcB4jqZs4z_3EQpVtkEVm0Z0L7VyTmQV7JC0gsTYGaAAAPUC

需要操作的数据

python 复制代码
class DeBugTalk:

    #场景一:读取yaml中的数据
    def read_yaml(self,key):
        with open("D:\study\pytest\extract.yaml", encoding="utf-8") as f:
            value = yaml.safe_load(f)
            return value[key]

    # 场景二:数据计算
    def add(self,a,b):
        return str(int(a)+int(b))

    # 场景三:读取随机数
    def random(self):
        return str(random.randint(1, 10))

热加载方法

python 复制代码
class ExtractUtil:
    def hotload_replace(self,data_str:str):
        # 1.定义一个正则匹配的通用表达式
        # regexp = "\\$\\{(.*?)\\}"   # 用于匹配格式为:${access_token}
        regexp = "\\$\\{(.*?)\\((.*?)\\)\\}"  # 用于匹配格式为:${函数名(参数)}
        fun_list = re.findall(regexp,data_str)

        for f in fun_list:
             print(f)
            # ${函数名(参数)} >>函数名=f[0],参数为=f[1]
            if f[1] == "":  # 当f[1]没有参数为''时
                value = getattr(DeBugTalk(), f[0])()  # >>此时通过反射调用了random()和dm5()方法
        
            else:  # 当f[1]有参数时
                value = getattr(DeBugTalk(), f[0])(*f[1].split(","))
        
            # 如果value的值为字符串格式,但是时数字,为了看着清楚明白,可以加一层处理
            if isinstance(value, str) and value.isdigit():
                value = "'" + value + "'"
            print('value:%s' % value, type(value))  # 注意这里的打印是在if同级,不然不满足的数据无法打印
            # 拼接旧的值
            old_value = "${"+f[0]+"("+f[1]+")}"
            # 将旧的值替换成新的值
            data_str = data_str.replace(old_value,str(new_value))
        return data_str


if __name__ == '__main__':
    request_data = {"data1":"${read_yaml(token)}","data2":"${add(1,2)}","data3": "${random()}"}
    data_str = yaml.safe_dump(request_data)
    print("old_str:%s" % data_str)
    data_str = ExtractUtil().hotload_replace(data_str)
    print("new_str:%s" % data_str)

打印结果

相关推荐
天若有情6734 小时前
程序员原创|借鉴JS事件冒泡,根治电脑文件混乱的“冒泡整理法”
开发语言·javascript·windows·ecmascript·电脑·办公·日常
小e说说4 小时前
拯救孩子学习兴趣大作战!这些软件超神了
学习
七颗糖很甜4 小时前
电离层对地基雷达测量精度的影响分析与校正方法
python
特种加菲猫4 小时前
继承,一场跨越时空的对话
开发语言·c++
AC赳赳老秦4 小时前
知识产权辅助:用 OpenClaw 批量生成专利交底书 / 软著申请材料,自动校验格式与内容合规性
java·人工智能·python·算法·elasticsearch·deepseek·openclaw
小熊Coding5 小时前
Python2D射击冒险闯关游戏2.0版本
python·pygame
FYKJ_20105 小时前
springboot校园兼职平台--附源码02041
java·javascript·spring boot·python·eclipse·django·php
玩转单片机与嵌入式5 小时前
玩转边缘AI(TInyML):需要掌握的C++知识汇总!
开发语言·c++·人工智能
茉莉玫瑰花茶6 小时前
Qt 信号与槽 [ 1 ]
开发语言·数据库·qt