Указание стилей для частей дампа PyYAML

Я использую YAML для компьютера и редактируемый человеком и читаемый формат ввода для симулятора. Для удобства чтения некоторые части ввода в основном поддаются блокированию стиля, тогда как стиль потока лучше подходит другим.

По умолчанию для PyYAML используется стиль блока везде, где есть вложенные карты или последовательности, и стиль потока везде. * default_flow_style * позволяет выбрать стиль всех потоков или стиль всех блоков.

Но я хотел бы выводить файлы более в форме

bonds:
- { strength: 2.0 }
- ...
tiles:
- { color: red, edges: [1, 0, 0, 1], stoic: 0.1}
- ...
args: 
    block: 2
    Gse: 9.4

Как можно видеть, это не следует последовательному шаблону для стилей повсюду, а вместо этого изменяется в зависимости от части файла. По сути, я хотел бы иметь возможность указать, что все значения в некоторых последовательностях стиля блока должны быть в стиле потока. Есть ли какой-нибудь способ получить такого рода точный контроль над демпингом? Возможность вывести отображение верхнего уровня в определенном порядке, не требуя этого порядка (например, omap), также было бы неплохо для удобства чтения.

Ответы на вопрос(1)

Решение Вопроса

это можно сделать, определив подклассы с представителями для каждого элемента, которые я не хочу следовать default_flow_style, а затем преобразовав все необходимое в те, что были перед сбросом. В этом случае это означает, что я получаю что-то вроде:

class blockseq( dict ): pass
def blockseq_rep(dumper, data):
    return dumper.represent_mapping( u'tag:yaml.org,2002:map', data, flow_style=False )

class flowmap( dict ): pass
def flowmap_rep(dumper, data):
    return dumper.represent_mapping( u'tag:yaml.org,2002:map', data, flow_style=True )

yaml.add_representer(blockseq, blockseq_rep)
yaml.add_representer(flowmap, flowmap_rep)

def dump( st ):
    st['tiles'] = [ flowmap(x) for x in st['tiles'] ]
    st['bonds'] = [ flowmap(x) for x in st['bonds'] ]
    if 'xgrowargs' in st.keys(): st['xgrowargs'] = blockseq(st['xgrowargs'])
    return yaml.dump(st)

Досадно, что более простые в использовании dumper.represent_list и dumper.represent_dict не позволяют указывать flow_style, поэтому я должен указать тег, но система работает.

 Hotschke10 мар. 2015 г., 15:02
На самом деле я пытаюсь применить вашflowmap на последовательности: `- ребра: \ n - [1,2] \ n - [2, 1, [1, 0]]. I'd like to have every edge on single separate line (as denoted by\ п). Currently, it looks like this: - ребра: \ n - [1,2] \ n - 1 \ n - 2 \ n - [1, 0] `
 cge10 мар. 2015 г., 21:42
Да, мой комментарий остается в силе;represent_mapping есть, а два других нет; они, вероятно, просто обертки дляrepresent_mapping, Что касается того, что вы делаете, блок-схема не то, что вы хотите. Вы последовательность (под ребрами :), которую вы хотите иметь flow_style = True, а не отображение.
 Hotschke10 мар. 2015 г., 15:00
Ваш комментарий еще актуален оdumper.represent_sequence а такжеdumper.represent_dict не имея опции flow_style? видетьpyyaml.org/wiki/PyYAMLDocumentation#Dumper
 Hotschke10 мар. 2015 г., 22:25
Можете ли вы заглянуть в мой пост?вопрос, Спасибо.

Ваш ответ на вопрос