Ваш вопрос не требует решения Python, но здесь используется PyYAML.
PyYAML позволяет подключать пользовательские конструкторы (например, !include
) к загрузчику YAML. Я включил корневой каталог, который можно установить таким образом, чтобы это решение поддерживало относительные и абсолютные ссылки на файлы.
Class-Based Solution
Вот класс на основе решения, что позволяет избежать глобальной корневой переменной моего первоначального ответа.
См. Это gist для аналогичного, более надежного решения Python 3, которое использует метакласс для регистрации пользовательского конструктора.
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)
Пример:
foo.yaml
a: 1
b:
- 1.43
- 543.55
c: !include bar.yaml
bar.yaml
- 3.6
- [1, 2, 3]
Теперь файлы могут быть загружены с помощью:
>>> 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
Я недавно столкнулся с [HiYaPyCo] (https://github.com/zerwes/hiyapyco) для Python, который делает именно это. Вы можете объединить разные файлы YAML. Это очень хороший модуль Python, который стоит знать. – nowox