如何让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
相关产品推荐
相关产品推荐

