Строковая интерполяция в YAML

В Perl я могу сделать что-то вроде следующего:

my $home = "/home";
my $alice = "$home/alice";

Могу ли я сделать что-то вроде следующего в YAML:

Home: /home
Alice: $Home/alice

Так что "Алиса" это эффективно /home/alice в конце?

3 ответа

Решение

К сожалению, вам не повезло. Чтобы сделать то, что вы хотите, вам нужно пройти в $home из файла представления (или где-либо еще) и вставьте его в запись yaml, которая может выглядеть примерно так:

Alice: ! '%{home}/Alice' 

См. Этот раздел вопросов и ответов Stackru для подробного ответа практически на ваш вопрос.

Вы должны использовать шаблон ERB.

Вы можете написать так:

Alice: <%=home%>/alice

При использовании нужно разобрать home Значение с ERB перед анализом как YAML. если home - локальная переменная, вам нужно передать локальную привязку в качестве аргумента метода #result. если вы не передадите это, по умолчанию будет использоваться привязка TOP LEVEL.

Как это:

require 'erb'

home = 'home'
YAML.load(ERB.new(yaml_content).result(binding))

Я также недавно искал это для Python и наткнулся на dynamic-yaml пакет через репозиторий Awesome YAML на Github.

Ссылка на Awesome YAML Github Repo: https://github.com/dreftymac/awesome-yaml Ссылка на динамический YAML для Python: https://github.com/childsish/dynamic-yaml

Надеюсь это поможет!

Изменить: поскольку комментарии верны и ссылки могут сломаться, вот простой пример:

Если у вас есть файл YAML, который выглядит так:

house:
    street: cool_street_name
    number: 45
    street_and_number: {house.street}-{house.number}

Установите dynamic_yaml с помощью python -m pip install dynamic_yaml для запуска следующего сценария.

import dynamic_yaml

with open(path_to_yaml_file, 'r') as f:
    data = dynamic_yaml.load(f)

Тогда вы получите:

print(data['house']['street_and_number'])
>> cool_street_name-45

Я в конечном итоге с помощью YAML::AppConfig но по общему признанию, это не решение YAML, а решение, специфичное для Perl. Это позволяет YAML включать $var с которые интерполируются.

С Yglu вы можете написать свой пример следующим образом:

Home: /home
Alice: !? .Home + '/alice'

или

Home: /home
Alice: !? ('{0}/alice').format($_.Home)

Отказ от ответственности: я являюсь автором Yglu.

Другие вопросы по тегам