如何将含自定义类调用的复杂列表字符串转为Python列表?
如何将含自定义类调用的字符串转为原结构的单元素列表用于单元测试Fixture
我正在为单元测试创建Fixture,需要模拟API返回的数据列表(无需实际调用API)来覆盖不同测试场景。目前我有一个包含自定义类调用(如PaginatedManagedEntityHeaders、ManagedEntityHeader)的复杂列表字符串,已保存为test_fixture.json文件。
我尝试了多种转换方法均失败:
- meth1:分割后得到25元素列表,不符合需求;
- meth2:
ast.literal_eval抛出ValueError; - meth3:
json.loads抛出JSONDecodeError; - meth4:提取数字得到20元素列表,不符合;
- meth5:
eval抛出NameError; - meth6:转换为整数时抛出
ValueError。
后续我尝试定义相关空函数解决NameError,却出现ValidationError;定义PaginatedManagedEntityHeaders空函数后虽生成列表,但内容被截断为[(3479865, None)],无法还原原结构。
现寻求可行方法,将该字符串转为含1个元素的列表,且输出与原字符串一致。
解决方案:定义匹配结构的模拟类,用eval解析
问题核心是你的字符串是包含自定义类实例化调用的Python字面量,而非标准JSON,所以需要让eval能识别这些类,同时保证生成的对象能还原原字符串的结构。
步骤1:定义模拟类
创建与原类同名的模拟类,跳过验证逻辑仅存储初始化参数,并实现__repr__方法还原原类的字符串格式:
class ManagedEntityHeader: def __init__(self, *args, **kwargs): # 存储所有初始化参数,不做验证 self.args = args self.kwargs = kwargs def __repr__(self): # 生成与原类一致的字符串表示 args_part = ", ".join(map(repr, self.args)) kwargs_part = ", ".join(f"{k}={v!r}" for k, v in self.kwargs.items()) combined = ", ".join(filter(None, [args_part, kwargs_part])) return f"ManagedEntityHeader({combined})" class PaginatedManagedEntityHeaders: def __init__(self, *args, **kwargs): self.args = args self.kwargs = kwargs def __repr__(self): args_part = ", ".join(map(repr, self.args)) kwargs_part = ", ".join(f"{k}={v!r}" for k, v in self.kwargs.items()) combined = ", ".join(filter(None, [args_part, kwargs_part])) return f"PaginatedManagedEntityHeaders({combined})"
步骤2:用eval解析字符串
读取文件内容后,直接用eval解析即可得到原结构的单元素列表:
with open("test_fixture.json", "r", encoding="utf-8") as f: fixture_content = f.read().strip() # 解析得到目标列表 result_list = eval(fixture_content) # 验证结果 assert isinstance(result_list, list) and len(result_list) == 1 # 检查输出是否与原字符串一致(忽略首尾空格) assert repr(result_list).strip() == fixture_content.strip()
为什么之前的方法失败?
json.loads:仅支持标准JSON语法,无法识别Python的类调用、关键字参数等语法;ast.literal_eval:仅允许解析Python字面量(数字、字符串、列表、字典等),不支持函数/类实例化调用;- 空函数/类:原类可能带有参数验证逻辑,或者
__repr__方法格式不匹配,导致生成的对象无法还原原字符串结构,甚至触发验证错误。
内容的提问来源于stack exchange,提问作者Ted M.
相关产品推荐
相关产品推荐

