Ihre Frage verlangt nicht nach einer Python-Lösung, aber hier ist eine mit PyYAML.
PyYAML ermöglicht es Ihnen, benutzerdefinierte Konstruktoren (wie !include
) dem YAML-Loader anzuhängen. Ich habe ein Stammverzeichnis eingefügt, das festgelegt werden kann, damit diese Lösung relative und absolute Dateiverweise unterstützt.
Klassenbasierte Lösung
Hier ist eine klassenbasierte Lösung, die die globale Stammvariablen meiner ursprünglichen Antwort vermeidet.
Sehen Sie sich diesen gist für eine ähnliche, robustere Python 3-Lösung an, die eine Metaklasse verwendet, um den benutzerdefinierten Konstruktor zu registrieren.
import yaml
import os
class Loader(yaml.SafeLoader):
def __init__(self, stream):
self._root = os.path.split(stream.name)[0]
super(Loader, self).__init__(stream)
def include(self, node):
filename = os.path.join(self._root, self.construct_scalar(node))
with open(filename, 'r') as f:
return yaml.load(f, Loader)
Loader.add_constructor('!include', Loader.include)
Ein Beispiel:
foo.yaml
a: 1
b:
- 1.43
- 543.55
c: !include bar.yaml
bar.yaml
- 3.6
- [1, 2, 3]
Die Dateien können jetzt geladen werden mit:
>>> with open('foo.yaml', 'r') as f:
>>> data = yaml.load(f, Loader)
>>> data
{'a': 1, 'b': [1.43, 543.55], 'c': [3.6, [1, 2, 3]]}
2 Stimmen
Ich bin kürzlich auf HiYaPyCo für Python gestoßen, das genau das macht. Sie können verschiedene YAML-Dateien zusammenführen. Es ist ein sehr schönes Python-Modul, das es wert ist, es zu kennen.
0 Stimmen
Siehe auch: stackoverflow.com/questions/41620674/use-placeholders-in-yaml