Python-dictionaries in yaml-Dokumenten mit PyYaml

Habe ich zwei python-Wörterbücher, die ich schreiben möchte, zu einer einzigen yaml-Datei, mit der zwei Dokumente:

definitions = {"one" : 1, "two" : 2, "three" : 3}
actions = {"run" : "yes", "print" : "no", "report" : "maybe"}

Der yaml-Datei sollte wie folgt Aussehen:

--- !define
one: 1
two: 2
three: 3

-- !action
run: yes
print: no
report: maybe
...

Mit PyYaml habe ich nicht finden einen klaren Weg, dies zu tun. Ich bin sicher, es gibt eine einfache Methode, doch das Graben in PyYaml-Dokumentation, nur hat mich verwirrt. Brauche ich einen dumper, emitter, oder was? Und welche Art von Ausgang jeder dieser Typen produziert? Yaml-text? yaml Knoten? YAMLObject? Trotzdem wäre ich dankbar für alle Erklärungen.


Folgenden unutbu die Antwort von unten, hier ist die Kurzfassung, ich könnte kommen mit:

DeriveYAMLObjectWithTag ist eine Funktion zum erstellen einer neuen Klasse, abgeleitet von YAMLObject mit dem gewünschten tag:

def DeriveYAMLObjectWithTag(tag):
    def init_DeriveYAMLObjectWithTag(self, **kwargs):
        """ __init__ for the new class """
        self.__dict__.update(kwargs)

    new_class = type('YAMLObjectWithTag_'+tag,
                    (yaml.YAMLObject,),
                    {'yaml_tag' : '!{n}'.format(n = tag),
                    '__init__' :  init_DeriveYAMLObjectWithTag})
    return new_class

Und hier ist, wie zu verwenden DeriveYAMLObjectWithTag, um die erforderliche Yaml:

definitions = {"one" : 1, "two" : 2, "three" : 3, "four" : 4}
actions = {"run" : "yes", "print" : "no", "report" : "maybe"}
namespace = [DeriveYAMLObjectWithTag('define')(**definitions),
             DeriveYAMLObjectWithTag('action')(**actions)]

text = yaml.dump_all(namespace,
                     default_flow_style = False,
                     explicit_start = True)

Dank an alle diejenigen, die antwortete. Ich scheint es einen Mangel an Funktionalität in PyYaml, und dies ist der eleganteste Weg, Sie zu überwinden.

Schreibe einen Kommentar