Ich habe die folgende YAML:
paths:
patha: /path/to/root/a
pathb: /path/to/root/b
pathc: /path/to/root/c
Wie kann ich dies "normalisieren", indem /path/to/root/
ich es von den drei Pfaden entferne und es als eigene Einstellung habe, so etwas wie:
paths:
root: /path/to/root/
patha: *root* + a
pathb: *root* + b
pathc: *root* + c
Offensichtlich ist das ungültig, ich habe es gerade erfunden. Was ist die wahre Syntax? Kann es gemacht werden?
syntax
yaml
transclusion
Andrew Bullock
quelle
quelle
Antworten:
Ich denke nicht, dass es möglich ist. Sie können "Knoten" wiederverwenden, aber nicht Teil davon.
Dies ist eine absolut gültige YAML und Felder
given
undfamily
werden imship-to
Block wiederverwendet . Sie können einen Skalarknoten auf dieselbe Weise wiederverwenden, aber Sie können nicht ändern, was sich darin befindet, und den letzten Teil eines Pfads aus YAML heraus hinzufügen.Wenn Sie die Wiederholung so sehr stört, schlage ich vor, Ihre Anwendung auf die
root
Eigenschaft aufmerksam zu machen und sie jedem Pfad hinzuzufügen, der relativ und nicht absolut aussieht.quelle
root
In-Code voranstellen . kein Biggie.Ja, mit benutzerdefinierten Tags. Beispiel in Python, bei dem das
!join
Tag Zeichenfolgen in einem Array verbindet:Was in ... endet:
Das Array von Argumenten
!join
kann eine beliebige Anzahl von Elementen eines beliebigen Datentyps enthalten, sofern sie in Zeichenfolgen konvertiert werden können. Dies!join [*a, "/", *b, "/", *c]
entspricht auch den Erwartungen.quelle
python3
?), Aber mit einer einfachen Änderung funktioniert sie wie erwartet. Speziell:yaml.SafeLoader.add_constructor(tag='!join', constructor=join)
yaml.load(open(fpth, mode='r'), Loader=yaml.SafeLoader)
Eine andere Möglichkeit, dies zu betrachten, besteht darin, einfach ein anderes Feld zu verwenden.
quelle
YML-Definition:
Irgendwo im Blatt
Ausgabe: / home / data / in / / home / data / in / p1
quelle
Ich habe eine auf Packagist verfügbare Bibliothek erstellt, die diese Funktion ausführt: https://packagist.org/packages/grasmash/yaml-expander
Beispiel YAML-Datei:
Beispiellogik:
Resultierendes Array:
quelle
In einigen Sprachen können Sie eine alternative Bibliothek verwenden. Tampax ist beispielsweise eine Implementierung von YAML-Verarbeitungsvariablen:
quelle
Dass Ihr Beispiel ungültig ist, liegt nur daran, dass Sie ein reserviertes Zeichen ausgewählt haben, mit dem Sie Ihre Skalare beginnen möchten. Wenn Sie das
*
durch ein anderes nicht reserviertes Zeichen ersetzen (ich verwende dafür eher Nicht-ASCII-Zeichen, da diese selten als Teil einer Spezifikation verwendet werden), erhalten Sie eine vollkommen legale YAML:Dies wird in die Standarddarstellung für Zuordnungen in der von Ihrem Parser verwendeten Sprache geladen und erweitert nichts auf magische Weise.
Verwenden Sie dazu einen lokal standardmäßigen Objekttyp wie im folgenden Python-Programm:
welches gedruckt wird:
Das Erweitern erfolgt im laufenden Betrieb und behandelt verschachtelte Definitionen. Sie müssen jedoch darauf achten, dass keine unendliche Rekursion aufgerufen wird.
Durch Angabe des Dumper können Sie die ursprüngliche YAML aufgrund der On-the-Fly-Erweiterung aus den geladenen Daten sichern:
Dadurch wird die Reihenfolge der Zuordnungsschlüssel geändert. Wenn das ein Problem ist, müssen Sie
self.d
eineCommentedMap
(importiert vonruamel.yaml.comments.py
)quelle
Ich habe meine eigene Bibliothek auf Python geschrieben, um Variablen, die aus Verzeichnissen geladen werden, mit einer Hierarchie wie der folgenden zu erweitern:
Der Hauptunterschied besteht darin, dass die Erweiterung erst angewendet werden muss, nachdem alle
config.yaml
Dateien geladen wurden. Dabei können die Variablen aus der nächsten Datei die Variablen aus der vorherigen überschreiben. Daher sollte der Pseudocode folgendermaßen aussehen:Als zusätzliche Option kann das
xonsh
Skript die resultierenden Variablen in Umgebungsvariablen exportieren (sieheyaml_update_global_vars
Funktion).Die Skripte:
https://sourceforge.net/p/contools/contools/HEAD/tree/trunk/Scripts/Tools/cmdoplib.yaml.py https://sourceforge.net/p/contools/contools/HEAD/tree/trunk/Scripts /Tools/cmdoplib.yaml.xsh
Vorteile :
${MYUNDEFINEDVAR}
->*$/{MYUNDEFINEDVAR}
)${env:MYVAR}
) erweitern\\
um/
in einem Pfad Variable (${env:MYVAR:path}
)Nachteile :
${MYSCOPE.MYVAR}
ist nicht implementiert)quelle
Mit Yglu können Sie Ihr Beispiel schreiben als:
Haftungsausschluss: Ich bin der Autor von Yglu.
quelle