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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie etwa:
ergibt
Und laden Sie die YAML zurück in Python Objekte:
Den Unterklassen von YAMLObject wurden verwendet, um das Anwendung-spezifische tags.
Gut, ich bin noch auf der Suche in den automatischen Kommentare (konnte Sie nicht finden, die Dokumente für das sofort), aber dies sollte den trick tun:
Ein Wort der Vorsicht, Wörterbücher sind ungeordnet, so dass die Reihenfolge der entstandene YAML ist nicht garantiert. Wenn Sie möchten, um in das Haus - Blick auf OrderedDict.