У меня есть следующий YAML:
paths:
patha: /path/to/root/a
pathb: /path/to/root/b
pathc: /path/to/root/c
Как я могу «нормализовать» это, удалив /path/to/root/
из трех путей и использовать его в качестве собственной настройки, что-то вроде:
paths:
root: /path/to/root/
patha: *root* + a
pathb: *root* + b
pathc: *root* + c
Очевидно, что это неверно, я просто выдумал. Какой реальный синтаксис? Это можно сделать?
syntax
yaml
transclusion
Эндрю Баллок
источник
источник
Ответы:
Я не думаю, что это возможно. Вы можете повторно использовать «узел», но не его часть.
Это совершенно допустимый YAML и поля
given
иfamily
повторно используются вship-to
блоке. Вы можете повторно использовать скалярный узел таким же образом, но вы не сможете изменить то, что находится внутри, и добавить к нему последнюю часть пути изнутри YAML.Если повторение вас беспокоит, я предлагаю сообщить вашему приложению о
root
свойствах и добавить его к каждому пути, который выглядит относительно не абсолютным.источник
root
в код. нет, важная персонаДа, используя пользовательские теги. Пример в Python, создание
!join
тега для объединения строк в массив:Что приводит к:
Массив аргументов to
!join
может иметь любое количество элементов любого типа данных, если они могут быть преобразованы в строку, что!join [*a, "/", *b, "/", *c]
делает то, что вы ожидаете.источник
python3
?), Но с простой модификацией вышеописанного оно работает как положено. В частности:yaml.SafeLoader.add_constructor(tag='!join', constructor=join)
yaml.load(open(fpth, mode='r'), Loader=yaml.SafeLoader)
Другой способ взглянуть на это - просто использовать другое поле.
источник
Определение YML:
Где-то в тимелист
Вывод: / home / data / in / / home / data / in / p1
источник
Я создал библиотеку, доступную на Packagist, которая выполняет эту функцию: https://packagist.org/packages/grasmash/yaml-expander
Пример файла YAML:
Пример логики:
Результирующий массив:
источник
В некоторых языках вы можете использовать альтернативную библиотеку. Например, тампакс является реализацией переменных обработки YAML:
источник
Ваш пример недопустим только потому, что вы выбрали зарезервированный символ для начала своих скаляров. Если вы замените его
*
каким-либо другим незарезервированным символом (я склонен использовать для этого не-ASCII-символы, поскольку они редко используются как часть какой-либо спецификации), вы получите совершенно допустимый YAML:Это загрузит стандартное представление для отображений на языке, который использует ваш синтаксический анализатор, и волшебным образом ничего не расширит.
Для этого используйте локальный тип объекта по умолчанию, как в следующей программе Python:
который напечатает:
Расширение выполняется на лету и обрабатывает вложенные определения, но вы должны быть осторожны, чтобы не вызывать бесконечную рекурсию.
Указав дампер, вы можете выгружать исходный YAML из загруженных данных из-за расширения на лету:
это изменит порядок отображения ключей сопоставления. Если это проблема , которую вы должны сделать (импортирован из )
self.d
CommentedMap
ruamel.yaml.comments.py
источник
Я написал свою собственную библиотеку на Python для расширения переменных, загружаемых из каталогов с такой иерархией, как:
Ключевое отличие здесь заключается в том, что расширение должно применяться только после
config.yaml
загрузки всех файлов, где переменные из следующего файла могут переопределять переменные из предыдущего, поэтому псевдокод должен выглядеть следующим образом:В качестве дополнительной опции
xonsh
скрипт может экспортировать полученные переменные в переменные окружения (см.yaml_update_global_vars
Функцию).Сценарии:
https://sourceforge.net/p/contools/contools/HEAD/tree/trunk/Scripts/Tools/cmdoplib.yaml.py https://sourceforge.net/p/contools/contools/HEAD/tree/trunk/Scripts /Tools/cmdoplib.yaml.xsh
Плюсы :
${MYUNDEFINEDVAR}
->*$/{MYUNDEFINEDVAR}
)${env:MYVAR}
)\\
до/
в переменной пути (${env:MYVAR:path}
)Минусы :
${MYSCOPE.MYVAR}
не реализовано)источник
С Yglu вы можете написать свой пример как:
Отказ от ответственности: я автор Yglu.
источник