从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)

打印结果

相关推荐
健康的猪2 分钟前
golang的cgo的一点小心得
开发语言·后端·golang
冰茶_7 分钟前
.NET MAUI 发展历程:从 Xamarin 到现代跨平台应用开发框架
学习·microsoft·微软·c#·.net·xamarin
夜夜敲码24 分钟前
C语言教程(十六): C 语言字符串详解
c语言·开发语言
帅云毅25 分钟前
Web3.0的认知补充(去中心化)
笔记·学习·web3·去中心化·区块链
豆豆26 分钟前
day32 学习笔记
图像处理·笔记·opencv·学习·计算机视觉
宋康30 分钟前
C语言结构体和union内存对齐
c语言·开发语言
逢生博客35 分钟前
使用 Python 项目管理工具 uv 快速创建 MCP 服务(Cherry Studio、Trae 添加 MCP 服务)
python·sqlite·uv·deepseek·trae·cherry studio·mcp服务
居然是阿宋40 分钟前
Kotlin高阶函数 vs Lambda表达式:关键区别与协作关系
android·开发语言·kotlin
堕落似梦42 分钟前
Pydantic增强SQLALchemy序列化(FastAPI直接输出SQLALchemy查询集)
python
nenchoumi31191 小时前
VLA 论文精读(十六)FP3: A 3D Foundation Policy for Robotic Manipulation
论文阅读·人工智能·笔记·学习·vln