Как включить другой YAML в качестве глобального базового файла, используя PyYAML

Я использую YAML в качестве механизма конфигурации, и мне нужно использовать его таким образом, чтобы я мог разделить конфигурации иерархическим способом, скажем, у меня есть base.yaml, который содержит некоторые значения по умолчанию, а затем файл overridden.yaml, который переопределяет базовые значения:

base.yaml

value: base

overridden.yaml

!include base.yaml

value: overridden

В конце концов, если я загружаю файл overridden.yaml, в идеале я хочу видеть значение, установленное как "переопределенный".

Я могу использовать этот трюк для включения другого файла YAML, но по-прежнему не хватает одного фрагмента, так как он не позволяет мне определять больше записей сразу после глобального включения с этой ошибкой:

yaml.scanner.ScannerError: mapping values are not allowed here

Я использую PyYAML для загрузки файлов YAML.

1 ответ

Решение

Это не работает потому, что вы !include создает один узел, потому что тег YAML применяется к одному узлу. Это было бы так же, как иметь ваш overridden.yaml выглядеть как:

"some string"
value: overridden

что не является действительным YAML либо.

Так что это не похоже на !include вставил бы текстовую версию и затем обработал бы целое. Вы можете сделать это с помощью препроцессора и / или языка шаблонов, но затем вы получите недопустимый файл YAML, потому что ключи в отображениях должны быть уникальными в соответствии со стандартом YAML 1.2 и даже устаревшими, которые поддерживает PyYAML. (Это, однако, не мешает PyYAML загружать это без предупреждения)

ИМО должен обратить внимание на использование независимой от языка функции слияния в сочетании с включением. Ваш base.yaml может выглядеть так же, как и ваш overridden.yaml может выглядеть так:

- &base !include base.yaml
- <<: *base
  value: overridden
Другие вопросы по тегам