Как включить другой 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