Votre question ne demande pas de solution Python, mais en voici une qui utilise PyYAML.
PyYAML vous permet de joindre des constructeurs personnalisés (tels que !include
) au chargeur YAML. J'ai inclus un répertoire racine qui peut être défini pour que cette solution prenne en charge les références de fichiers relatives et absolues.
Solution
Class-Based Voici une solution de classe, qui évite la variable globale racine de ma réponse originale.
Voir cette gist pour une solution Python 3 similaire, plus robuste qui utilise une métaclasse pour enregistrer le constructeur personnalisé.
import yaml
import os.path
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)
Un exemple:
foo.yaml
a: 1
b:
- 1.43
- 543.55
c: !include bar.yaml
bar.yaml
- 3.6
- [1, 2, 3]
Maintenant, les fichiers peuvent être chargés à l'aide:
>>> 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]]}
http://therightstuff.de/2010/01/30/Rake-YAML-And-Inherited-Build-Configuration.aspx – Darragh
Je suis récemment tombé sur [HiYaPyCo] (https://github.com/zerwes/hiyapyco) pour Python qui fait exactement cela. Vous pouvez fusionner différents fichiers YAML ensemble. C'est un très bon module Python qui mérite d'être connu. – nowox