2012-12-22 10 views
6

Używam YAML dla komputera i edytowanego przez człowieka i czytelnego formatu wejściowego dla symulatora. Aby zapewnić czytelność człowieka, niektóre elementy danych wejściowych są w większości podatne na blokowanie stylu, a styl przepływu bardziej pasuje do innych.Określanie stylów dla fragmentów PyYAML dump

Domyślną wartością PyYAML jest użycie stylu blokowego, w którym występują zagnieżdżone mapy lub sekwencje, a także styl przepływu w innych miejscach. * default_flow_style * pozwala wybrać styl w stylu pełnego przepływu lub blokowy.

Ale chciałbym więcej plików z postaci wyjście

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

Jak widać, to nie wynika spójny wzorzec dla całej stylów, a zamiast tego zmienia się w zależności od części pliku . Zasadniczo chciałbym móc określić, że wszystkie wartości w niektórych sekwencjach stylów bloku mają styl przepływu. Czy jest jakiś sposób na uzyskanie tego rodzaju drobiazgowej kontroli nad zrzutem? Możliwość zrzutu mapowania najwyższego poziomu w określonej kolejności, nie wymagając tego zamówienia (np. Omap), również byłaby dobra dla czytelności.

Odpowiedz

11

Okazuje się, że można tego dokonać, definiując podklasy za pomocą reprezentantów dla każdego elementu, którego nie chcę używać default_flow_style, a następnie konwertując wszystko, co niezbędne, przed zrzutem. W tym przypadku oznacza to, że mam coś takiego:

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) 

Nieznośno The dumper.represent_list łatwiejsze w obsłudze i dumper.represent_dict nie pozwalają flow_style być określona, ​​więc muszę określić znacznik, ale system działa.

+0

Czy twój komentarz jest ciągle aktualny na temat 'dumper.represent_sequence' i' dumper.represent_dict' nie ma opcji flow_style opcji? zobacz http://pyyaml.org/wiki/PyYAMLDocumentation#Dumper – Hotschke

+0

Właściwie próbuję zastosować twoją 'flowmap' na sekwencji:' - edges: \ n - [1,2] \ n - [2, 1, [1 , 0]] ". Chciałbym mieć każdą krawędź na pojedynczej linii (oznaczonej przez '\ n'). Obecnie wygląda to następująco: '- edges: \ n - [1,2] \ n - 1 \ n - 2 \ n - [1, 0]' – Hotschke

+0

Tak, mój komentarz jest nadal ważny; "represent_mapping" ma to, ale pozostałe dwie nie; prawdopodobnie są to po prostu opakowania dla 'represent_mapping'. Jeśli chodzi o to, co robisz, mapa nie jest tym, czego potrzebujesz. Ty sekwencję (pod krawędziami :), którą chcesz mieć flow_style = True, a nie mapowanie. – cge

Powiązane problemy