我不确定这是否是更好的方法,但如果您尝试往返所需的输出,您
会看到 ruamel.yaml 实际上可以保留您标记的字符串,而无需您
做任何事情。检查 Python 数据结构,您会注意到 ruamel.yaml 确实
这是通过创建一个TaggedScalar 来实现的(因为您不能将属性附加到内置字符串类型)。
import sys
import ruamel.yaml
yaml_str = """\
includes:
- !include vars.yaml
- !exclude dummy.yaml
"""
yaml = ruamel.yaml.YAML()
data = yaml.load(yaml_str)
yaml.dump(data, sys.stdout)
incl = data['includes'][0]
print(type(incl))
给出:
includes:
- !include vars.yaml
- !exclude dummy.yaml
<class 'ruamel.yaml.comments.TaggedScalar'>
检查comments.py(可能还有constructor.py)后,您应该能够
即时制作ruamel.yaml 的内部数据结构:
import sys
import ruamel.yaml
from ruamel.yaml.comments import TaggedScalar
def tagged_string(tag, val):
# starting with ruamel.yaml>0.16.5 you can replace the following lines with:
# return TaggedScalar(value=val, tag=tag)
ret_val = TaggedScalar()
ret_val.value = val
ret_val.yaml_set_tag(tag)
return ret_val
yaml = ruamel.yaml.YAML()
data = dict(includes=[tagged_string('!include', 'vars.yaml'),
tagged_string('!include', 'vars.yaml'),
])
yaml.dump(data, sys.stdout)
这也给出了:
includes:
- !include vars.yaml
- !include vars.yaml