YAML включает в себя автоматизацию - PullRequest
1 голос
/ 07 мая 2019

Использование YAML для создания и поддержки конфигурации для моей программы на Python, и мне это нравится. Мой конфиг огромен, поэтому его пришлось разделить на логически отдельный файл поменьше и использовать трюк add_constructor() с тегом !include.

Конфиг является иерархическим, он выглядит следующим образом (ну, с гораздо большим количеством уровней). Разделы имеют свои собственные файлы YAML в структуре каталогов, соответствующей иерархии конфигурации (т.е. A/B/C.yaml):

A:
  B:
    C: !include A/B/C

Добавленный конструктор для тега !include получает 2 аргумента, загрузчик и объекты узла, как обычно. Я почти уверен, что путь в графе узлов может быть каким-то образом определен из загрузчика и / или объекта узла.

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

Я ленивый и хочу указать только один "! Include this " в моей конфигурации, то есть без указания (снова) пути в иерархии.

A:
  B:
    C: !include this

«this» должно быть ключевым словом рода, так что значение узла существует, и я могу оставить опцию открытой для указания реального / другого пути. Мой конструктор затем проверит значение узла и, если ключевое слово "this" найдено, вычислит путь, в противном случае значение узла будет использоваться буквально в качестве пути.

1 Ответ

0 голосов
/ 07 мая 2019

Я бы предложил сделать это вместо:

!include_dir_hierarchy
  path: "."
  prefixes: [ Section_, Sub-section_, Sub-sub-section_ ]

Предполагая, что path указывает на корень иерархии A/B/C, вы можете в конструкторе пройти по указанному пути и сгенерировать иерархию в памяти на основе имен каталогов и списка префиксов. Из вашего вопроса я делаю вывод, что такое отображение между путем файловой системы и иерархией YAML возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...