我只需要稍微调整一下YAML解析器¹:import ruamel.yaml as yaml
from ruamel.yaml.comments import CommentedMap
yaml_str = """\
root_path: /root # use this key for expansion of values
script_path: root_path + /scripts
"""
def set_item(self, key, value):
split_val = value.split(' + ', 1)
if len(split_val) > 1:
alt_key = split_val[0].strip()
if alt_key in self.keys():
value = self.get(alt_key) + split_val[1]
self._org__setitem__(key, value)
CommentedMap._org__setitem__ = CommentedMap.__setitem__
CommentedMap.__setitem__ = set_item
data = yaml.load(yaml_str, Loader=yaml.RoundTripLoader)
print yaml.dump(data, Dumper=yaml.RoundTripDumper)
会给你:
^{pr2}$
请注意,注释和键的顺序都是用RoundTripLoader/Dumper组合保存的。data与普通Python dict一样工作。在
¹这是使用ruamel.yaml完成的,我是其中的作者。它是PyYAML的超集,主要目的是为数据往返保留注释和其他信息。