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

如何让ruamel.yaml加载含未定义别名的YAML时将合并语句视为字符串?

解决ruamel.yaml加载含未定义别名的合并语句并保留原内容的问题

有两种可行方案实现需求,具体如下:

方案一:修改YAML字符串转义特殊符号

如果允许修改原始YAML内容,直接用单引号包裹特殊键和值,让YAML解析器将它们视为普通字符串,避免触发合并键和别名解析:

yaml_str = """
hello1 : world
foo:
    '<<': '*core_foo'
"""

加载后会得到预期的字典结构:{'hello1': 'world', 'foo': {'<<': '*core_foo'}}。

方案二:自定义ruamel.yaml加载逻辑(无需修改原始YAML)

如果不能修改原始YAML字符串,可以通过覆盖ruamel.yaml的构造器逻辑,禁用合并键处理并捕获未定义别名,将其转为普通字符串:

from ruamel.yaml import YAML

yaml = YAML()
# 禁用合并键的扁平化处理,保留<<作为普通键
yaml.constructor.flatten_mapping = lambda self, node: None
# 允许重复键,避免合并键相关的键冲突报错
yaml.allow_duplicate_keys = True

# 自定义别名构造逻辑,未定义的别名转为带*的字符串
original_alias_constructor = yaml.constructor.construct_yaml_alias
def custom_alias_constructor(self, node):
    try:
        return original_alias_constructor(self, node)
    except KeyError:
        return f"*{node.value}"

yaml.constructor.construct_yaml_alias = custom_alias_constructor

# 加载原始YAML字符串
yaml_str = """
hello1 : world
foo:
    <<: *core_foo
"""
data = yaml.load(yaml_str)
print(data)
# 输出结果:{'hello1': 'world', 'foo': {'<<': '*core_foo'}}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:04:53