Строковая интерполяция в 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.