ruamel.yaml 0.18.x中add_constructor()的使用方法咨询
关于ruamel.yaml 0.18.x自定义构造函数的正确实现方式
你的方案是官方推荐的正确做法,原因如下:
- ruamel.yaml 0.18.x重构了加载逻辑,移除顶层
load_all()等函数后,不再支持全局注册构造函数的老方式,必须通过构造函数子类或YAML实例来绑定自定义逻辑。 - 子类化
Constructor(如果需要保留YAML原有特性如注释、节点顺序,可子类化RoundTripConstructor)并在子类中注册!include构造函数,是官方文档明确建议的扩展方式。这种方式能确保构造函数逻辑和特定的YAML解析实例绑定,避免全局状态冲突。 - 典型的实现示例如下:
from ruamel.yaml import Constructor, YAML class CustomConstructor(Constructor): def __init__(self): super().__init__() self.add_constructor('!include', self.construct_include) def construct_include(self, node): # 实现!include的加载逻辑 with open(node.value, 'r', encoding='utf-8') as f: return f.read() # 初始化YAML实例并绑定自定义构造器 yaml = YAML() yaml.Constructor = CustomConstructor # 加载目标YAML文件 with open('config.yaml', 'r', encoding='utf-8') as f: data = yaml.load(f)
如果你的场景需要保留YAML的往返序列化特性(比如注释、键顺序),只需将Constructor替换为RoundTripConstructor即可,逻辑注册方式完全一致。
内容的提问来源于stack exchange,提问作者Lele Gaifax
相关产品推荐
相关产品推荐

