如何自定义YAML标签读取Python自定义类实例及多实例读写
问题1:解决ConstructorError错误
出现该错误是因为PyYAML无法识别自定义movement类的序列化标签,需通过注册自定义表示器和构造器让PyYAML能解析该类实例。以下是修正后的完整代码:
import yaml from yaml.loader import SafeLoader # 类名遵循Python大驼峰规范,提升可读性 class Movement: def __init__(self, ID, val): self.ID = ID self.val = val # 注册表示器:将Movement实例转为YAML自定义标签格式 def movement_representer(dumper, data): return dumper.represent_mapping('!movement', { 'ID': data.ID, 'val': data.val }) yaml.add_representer(Movement, movement_representer) # 注册构造器:解析YAML中的!movement标签为Movement实例 def movement_constructor(loader, node): mapping = loader.construct_mapping(node) return Movement(**mapping) yaml.add_constructor('!movement', movement_constructor, Loader=SafeLoader) # 创建实例并保存 m1 = Movement('A', 10) with open('test.yaml', 'w') as file: yaml.dump(m1, file) # 读取文件 with open('test.yaml') as file: result = yaml.load(file, Loader=SafeLoader) print(type(result)) # 输出:<class '__main__.Movement'> print(result.ID, result.val) # 输出:A 10
问题2:保存并读取多个Movement实例
只需将多个实例放入列表(或字典)这类容器中,序列化容器即可;读取时直接解析容器,再逐个取出实例。基于问题1的代码,添加多实例处理逻辑如下:
# 创建多个Movement实例 m1 = Movement('A', 10) m2 = Movement('B', 20) m3 = Movement('C', 30) # 将实例存入列表,写入YAML文件 movement_list = [m1, m2, m3] with open('multi_movements.yaml', 'w') as file: yaml.dump(movement_list, file) # 读取多实例 with open('multi_movements.yaml') as file: loaded_instances = yaml.load(file, Loader=SafeLoader) # 遍历输出每个实例信息 for idx, inst in enumerate(loaded_instances): print(f"实例{idx+1}: 类型={type(inst)}, ID={inst.ID}, val={inst.val}")
生成的multi_movements.yaml内容示例:
- !movement ID: A val: 10 - !movement ID: B val: 20 - !movement ID: C val: 30
注意事项
- 始终使用
SafeLoader加载YAML,避免潜在的安全风险。 - 若需要更紧凑的格式,可在
yaml.dump时添加default_flow_style=True参数生成流式输出。
内容的提问来源于stack exchange,提问作者David123
相关产品推荐
相关产品推荐

