问题:当参数为动态参数时,Template替换无法进行二次处理
解决方案:通过热加载来进行替换
热加载原理:在代码运行的过程中动态的调用python中的方法达到获得动态参数
可以进行热加载的情况:yaml文件,随机数,替换后的值进行计算,加密等
示例:
需要热加载的数据:
yaml数据:extract.yaml
token: 76_ZgYcDxWFgCCjZVj2EPfqj7QWW_k3-iUZq68Mr6hE_VvDDa_IAfjEIi7nQwMUoISer8MAspesP1JnP1iIziezVPcB4jqZs4z_3EQpVtkEVm0Z0L7VyTmQV7JC0gsTYGaAAAPUC
需要操作的数据
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))
热加载方法
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)
打印结果文章来源:https://www.toymoban.com/news/detail-795177.html
文章来源地址https://www.toymoban.com/news/detail-795177.html
到了这里,关于从0开始python学习-47.pytest框架之解决Template替换无法进行二次处理的问题之热加载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!