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

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)

关键变化说明

  1. 实例化YAML类:用typ参数指定加载器类型,'rt'对应原RoundTripLoader(适合需要保留注释、引号的场景),'safe'对应安全加载器,'unsafe'对应无限制加载器。
  2. 注册构造器:直接通过yaml.constructor.add_constructor()注册自定义标签,替代原Loader子类的add_constructor方法。
  3. 配置参数迁移:原ruamel.yaml.load()的参数(如preserve_quotes)现在直接作为YAML实例的属性设置。

内容的提问来源于stack exchange,提问作者Erotemic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 20:49:59