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

Я использую YAML в качестве механизма конфигурации, и мне нужно использовать его таким образом, чтобы я мог разделить конфигурации иерархическим способом, скажем, у меня есть base.yaml, который содержит некоторые значения по умолчанию, а затем переопределен.Файл 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 Ответ

0 голосов
/ 06 октября 2018

Причина, по которой это не работает, заключается в том, что вы !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
...