YAML 规范明确指出,映射中的键顺序是不能依赖的“表示细节”。因此,如果您的设置文件依赖于映射,则它已经无效,如果可能的话,最好使用有效的 YAML。
当然,YAML 是可扩展的,没有什么能阻止您向设置文件添加“有序映射”类型。例如:
!omap setting1:
name: [item,item]
name1: text
!omap anothersetting2:
name: [item,item]
!omap sub_setting:
name :[item,item]
你没有提到yaml
你正在使用哪个模块。标准库中没有这样的模块,并且仅在 PyPI 上至少有两个包提供具有该名称的模块。但是,我猜它是 PyYAML,因为据我所知这是最受欢迎的。
上面描述的扩展很容易用 PyYAML 解析。见http://pyyaml.org/ticket/29:
def omap_constructor(loader, node):
return loader.construct_pairs(node)
yaml.add_constructor(u'!omap', omap_constructor)
现在,而不是:
{'anothersetting2': {'name': ['item', 'item'],
'sub_setting': 'name :[item,item]'},
'setting1': {'name': ['item', 'item'], 'name1': 'text'}}
你会得到这个:
(('anothersetting2', (('name', ['item', 'item']),
('sub_setting', ('name, [item,item]'),))),
('setting1', (('name', ['item', 'item']), ('name1', 'text'))))
当然这给了你一个tuple
key-value tuple
,但是你可以很容易地写一个construct_ordereddict 并得到一个OrderedDict
。如果您需要输出和输入,您还可以编写一个将OrdereredDict
对象存储为s 的表示器。!omap
如果您真的想挂钩 PyYAML 以使其使用 anOrderedDict
而不是 adict
进行默认映射,那么如果您已经直接处理解析器对象,这很容易做到,但如果您想坚持使用高级便利方法则更加困难. 幸运的是,上面链接的票证有一个您可以使用的实现。请记住,您不再使用真正的 YAML,而是一种变体,因此任何其他处理您的文件的软件都可能并且很可能会破坏。