python-yaml.dump schlechte Einrückung
Ich bin mit dem ausführen des folgenden python-code:
import yaml
foo = {
'name': 'foo',
'my_list': [{'foo': 'test', 'bar': 'test2'}, {'foo': 'test3', 'bar': 'test4'}],
'hello': 'world'
}
print(yaml.dump(foo, default_flow_style=False))
aber ist Druck:
hello: world
my_list:
- bar: test2
foo: test
- bar: test4
foo: test3
name: foo
statt:
hello: world
my_list:
- bar: test2
foo: test
- bar: test4
foo: test3
name: foo
Wie kann ich das Einrücken der my_list
Elemente auf diese Weise?
- Beide Versionen sind korrekt, also im schlimmsten Fall ist dies ein ästhetisches Anliegen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieses ticket schlägt vor, die aktuelle Implementierung korrekt folgt die Skillung:
Auf dem gleichen thread, es gibt auch dieses code-snippet (angepasst deinem Beispiel) um das Verhalten, das Sie suchen:
OpenCV
. DieOpenCV
YAML-parser erfordert die zusätzliche Einrückung. Ansonsten wirft er eine exception. Diese Lösung behebt es. Ich WünschePyYAML
nicht verlangen, so viel sub-classing, um die Dinge funktionieren. JSON ist viel weniger Komplex, außer es gibt keine built-in-OpenCV-parser dafür.Falls es hilft, ich schrieb einige code zu umgehen mit dem selben problem. Geben Sie einfach die original-Ausgabe von yaml.dump() auf _fix_dump().
Ihren Ausgang, wie gezeigt, ist unvollständig, wie
print(yaml.dump())
gibt Sieeine zusätzliche Leerzeile nach
name: foo
. Es ist auch langsamer und verbraucht mehrSpeicher als direkt-streaming zu
sys.stdout
.Sind Sie wahrscheinlich mit PyYAML und, abgesehen von nur die Unterstützung der veralteten YAML 1.1-Spezifikation,
es ist sehr begrenzte Kontrolle über die gedumpten YAML.
Schlage ich vor, Sie
ruamel.yaml
(disclaimer: ich bin der Autor des Pakets), wo Sie könnengeben Sie die Einrückung separat für Zuordnungen und Abfolgen und auch zeigen, wie weit
zum Ausgleich der Strich innerhalb der Gedankenstrich vor der Sequenz-element:
gibt:
Bitte beachten Sie, dass die Reihenfolge der Schlüssel ist von der Implementierung abhängig
(kann aber kontrolliert werden, da
ruamel.yaml
können round-trip die obenohne änderungen).
print()
Anruf kann noch leicht korrigiert werden, um keine Ausgabe erhalten eine extra-Zeilenvorschub:print(something, end='')