Спецификация 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
ключ-значение tuple
s, но вы можете легко написать _construct_ordereddict и вместо этого получить OrderedDict
. Вы также можете написать репрезентатор, который хранит OrdereredDict
объектов как !omap
s, если вам нужно не только вводить, но и выводить.
Если вы действительно хотите перехватить PyYAML, чтобы он использовал OrderedDict
вместо dict
для сопоставлений по умолчанию, это довольно легко сделать, если вы уже работаете непосредственно с объектами парсера, но сложнее, если вы хотите придерживаться высокоуровневого методы удобства. К счастью, указанный выше билет имеет реализацию, которую вы можете использовать. Просто помните, что вы больше не используете настоящий YAML, а его вариант, поэтому любое другое программное обеспечение, работающее с вашими файлами, может и, скорее всего, сломается.
person
abarnert
schedule
08.11.2012