You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 04:43:22