ruamel.yaml 0.15.0新API下如何使用自定义Loader?
在ruamel.yaml新API中使用自定义Loader的方法
ruamel.yaml的新API并没有移除自定义Loader的支持,只是换了更简洁的配置方式——不再需要手动定义并传入Loader类,而是通过YAML实例来直接配置自定义构造器。
核心修改思路
新API用面向对象的YAML实例封装了所有Loader/Dumper的配置逻辑,自定义标签的构造器直接注册到实例上即可,无需再单独封装Loader子类。
修改后的完整代码
import io import os import ubelt as ub from ruamel.yaml import YAML # 创建YAML实例,typ='rt'对应原RoundTripLoader,支持保留注释、引号 yaml = YAML(typ='rt') yaml.preserve_quotes = True def _construct_include_tag(self, node): print(f'node={node}') if isinstance(node.value, list): return [yaml.coerce(v.value) for v in node.value] else: external_fpath = ub.Path(node.value) if not external_fpath.exists(): raise IOError(f'Included external yaml file {external_fpath} does not exist') with open(external_fpath, 'r') as f: return yaml.load(f) # 给YAML实例注册自定义标签构造器 yaml.constructor.add_constructor("!include", _construct_include_tag) # 加载目标文件 with open('your_target_file.yaml', 'r') as file: data = yaml.load(file)
关键变化说明
- 实例化YAML类:用
typ参数指定加载器类型,'rt'对应原RoundTripLoader(适合需要保留注释、引号的场景),'safe'对应安全加载器,'unsafe'对应无限制加载器。 - 注册构造器:直接通过
yaml.constructor.add_constructor()注册自定义标签,替代原Loader子类的add_constructor方法。 - 配置参数迁移:原
ruamel.yaml.load()的参数(如preserve_quotes)现在直接作为YAML实例的属性设置。
内容的提问来源于stack exchange,提问作者Erotemic
相关产品推荐
相关产品推荐

