修复预期替换成1,2,3字符串时,由于最后返回eval了一下,实际替换成(1,2,3)的问题

This commit is contained in:
floraachy
2023-11-16 08:40:04 +08:00
parent 1e7edfc24f
commit 4c175e101c
+86 -40
View File
@@ -287,6 +287,10 @@ class DataHandle:
return replaced_text, placeholders
def data_handle(self, obj, source=None):
obj = self.eval_data(obj)
return self.data_handle_(obj, source)
def data_handle_(self, obj, source=None):
"""
递归处理字典、列表中的字符串,将${}占位符替换成source中的值
"""
@@ -310,15 +314,26 @@ class DataHandle:
obj, keys = self.replace_and_store_placeholders(pattern, obj)
# 接着处理表达式和关键字替换,先进行关键字替换
keys = eval(Template(str(keys)).safe_substitute(source)) # 替换并转为字典
should_eval = 0
for key, value in keys.items(): # 遍历字典替换
obj = obj.replace(key, value[0])
if not isinstance(source[value[1]], str):
should_eval = 1
if should_eval == 1:
obj = self.eval_data(obj)
if not isinstance(obj, str):
return self.data_handle(obj)
# 再找一遍剩余的${}跟第一步的结果合并,提取漏掉的诸如1+1的表达式(在此认为关键字无法替换的都是表达式,最后表达式也无法处理的情况就报错或者原样返回)
obj, func_temp = self.replace_and_store_placeholders(pattern, obj)
func.update(func_temp)
# 进行函数调用替换
obj = self.invoke_funcs(obj, func)
# 把处理后的结果,eval一下
return self.eval_data(obj)
# 直接返回最后的结果
return obj
# return self.eval_data(obj)
elif isinstance(obj, list):
for index, item in enumerate(obj):
obj[index] = self.data_handle(item, source)
@@ -371,103 +386,121 @@ data_handle = DataHandle().data_handle
if __name__ == '__main__':
# 下面是测试代码
print("-----------测试场景1---------------------")
# 需要识别${python表达式},这里random方法是需要导入random包的
data_01 = "选择.gitignore: ${random.choice(['Ada', 'Actionscript', 'Ansible', 'Android', 'Agda'])},开源许可证: ${random.choice(['0BSD', 'AAL', 'AFL-1.1', '389-exception'])}"
new = data_handle(data_01)
print(new, type(new))
print("-----------测试场景2---------------------")
target = {
"user_id": 1,
"user_name": "flora",
"name": "test",
"age": 17
}
# 需要识别${python表达式},这里random方法是需要导入random包的
data_01 = "选择.gitignore: ${random.choice(['Ada', 'Actionscript', 'Ansible', 'Android', 'Agda'])},开源许可证: ${random.choice(['0BSD', 'AAL', 'AFL-1.1', '389-exception'])}"
# new = data_handle(data_01)
# print(new, type(new))
# 这个用到了target
data_02 = {
"age": "${generate_random_int()}.",
"age": "${generate_random_int()}",
"message": "Hello, ${FakerData().generate_female_name()}! Your age is ${age}. Random number: ${FakerData().generate_random_int()}",
"nested_data": [
"This is ${name}'s data.",
{
"message": "Age: ${age}.",
"message": "Age: ${age}",
"nested_list": [
"More data: ${generate_random_int()}",
]
}
]
}
# new = data_handle(data_02, target)
# print(new, type(new))
new = data_handle(data_02, target)
print(new, type(new))
print("-----------测试场景3---------------------")
data_03 = "user_id: ${user_id}, user_name: ${user_name}"
# new = data_handle(data_03, target)
# print(new, type(new))
new = data_handle(data_03, target)
print(new, type(new))
print("-----------测试场景4---------------------")
# 需要识别 字符串里面是python表达式的情况
data_04 = "[1,2,3,4]"
# new = data_handle(data_04)
# print(new, type(new))
new = data_handle(data_04)
print(new, type(new))
print("-----------测试场景5---------------------")
data_05 = "1+1"
# new = data_handle(data_05)
# print(new, type(new))
new = data_handle(data_05)
print(new, type(new))
print("-----------测试场景6---------------------")
data_06 = "[1, '1', [1, 2], {'name':'flora', 'age': '1'}]"
# new = data_handle(data_06)
# print(new, type(new))
new = data_handle(data_06)
print(new, type(new))
print("-----------测试场景7---------------------")
# 需要识别自定义的函数,同时支持多种,下面两种写法有细微差别
data_07 = "Hello, ${generate_female_name()}! Random number: ${generate_random_int()}"
# new = data_handle(data_07)
# print(new, type(new))
new = data_handle(data_07)
print(new, type(new))
print("-----------测试场景8---------------------")
data_08 = "Hello, ${generate_female_name()}! Random number: ${FakerData().generate_random_int()}"
# new = data_handle(data_08)
# print(new, type(new))
new = data_handle(data_08)
print(new, type(new))
print("-----------测试场景9---------------------")
data_09 = "Hello, ${FakerData().generate_female_name()}! Random number: ${FakerData.generate_random_int()}"
# new = data_handle(data_09)
# print(new, type(new))
new = data_handle(data_09)
print(new, type(new))
print("-----------测试场景10---------------------")
data_10 = {
"payload": {
"startTime": "${FakerData.generate_time('%Y-%m-%d')}",
"common2": "${faker.name()}", # 这里是使用类FakerData里面的实例属性faker
"url": "/api/accounts/${FakerData.generate_time('%Y-%m-%d')} / login.json",
"url": "/api/accounts/${FakerData.generate_time('%Y-%m-%d')}/login.json",
"fragement": {
"startTime": "${FakerData.generate_time('%Y-%m-%d')}",
"common2": "${faker.name()}", # 这里是使用类FakerData里面的实例属性faker
"url": "/api/accounts/${FakerData.generate_time('%Y-%m-%d')} / login.json"
"url": "/api/accounts/${FakerData.generate_time('%Y-%m-%d')}/login.json"
}
}
}
# new = data_handle(data_10)
# print(new, type(new))
new = data_handle(data_10)
print(new, type(new))
print("-----------测试场景11---------------------")
data_11 = "/api/accounts/${FakerData.generate_time('%Y-%m-%d')}/login.json"
# new = data_handle(data_11)
# print(new, type(new))
new = data_handle(data_11)
print(new, type(new))
print("-----------测试场景12---------------------")
# FakerData类中没有封装random_name这个方法,会无法处理
data_12 = '[[1,2,3,4],"${FakerData().random_name()}"]'
# new = data_handle(data_12)
# print(new, type(new))
new = data_handle(data_12)
print(new, type(new))
print("-----------测试场景13---------------------")
# 下面这种写法不是字符串里面,不是正确格式的列表,${FakerData().generate_name()需要用引号包起来,因此无法正确处理成列表,最后返回的是str
data_13 = '[[1,2,3,4],${FakerData().generate_name()}]'
# new = data_handle(data_13)
# print(new, type(new))
new = data_handle(data_13)
print(new, type(new))
data_15 = '[[1,2,3,4],${FakerData().generate_random_int()}]'
# new = data_handle(data_15)
# print(new, type(new))
print("-----------测试场景14---------------------")
data_14 = '[[1,2,3,4],${FakerData().generate_random_int()}]'
new = data_handle(data_14)
print(new, type(new))
print("-----------测试场景15---------------------")
# 导入其他方法,也可以直接使用
# from common_utils.time_handle import test_fun_a
# data = "${test_fun_a()}"
# new = data_handle(data)
# print(new, type(new))
print("-----------测试场景16---------------------")
# 支付方法传参使用
payload = {
"name": "${generate_name(lan='zh')}",
@@ -475,5 +508,18 @@ if __name__ == '__main__':
"desc": '[[1,2,3,4],"${FakerData().generate_random_int()}"]',
"pre": '[[1,2,3,4],${FakerData().generate_name()}]'
}
# new = data_handle(payload)
# print(new, type(new))
new = data_handle(payload)
print(new, type(new))
print("-----------测试场景17---------------------")
data_17 = {
"winner_id": "${winner_id}",
"user_id": "${user_id}"
}
source = {
"winner_id": "1,2,4",
"user_id": []
}
res = data_handle(obj=data_17, source=source)
print(res)