У меня есть yaml с тегами, специфичными для приложения (если быть точным, из шаблона AWS Cloud Formation), который выглядит так:
example_yaml = "Name: !Join [' ', ['EMR', !Ref 'Environment', !Ref 'Purpose']]"
Я хочу разобрать его, чтобы я мог это сделать:
>>> print(result)
>>> {'Name': 'EMR {Environment} {Purpose}'}
>>> name = result['name'].format(
... Environment='Development',
... Purpose='ETL'
... )
>>> print(name)
>>> EMR Development ETL
В настоящее время мой код выглядит так:
import yaml
from pprint import pprint
def aws_join(loader, node):
join_args = loader.construct_yaml_seq(node)
delimiter = list(join_args)[0]
joinables = list(join_args)[1]
join_result = delimiter.join(joinables)
return join_result
def aws_ref(loader, node):
value = loader.construct_scalar(node)
placeholder = '{'+value+'}'
return placeholder
yaml.add_constructor('!Join', aws_join)
yaml.add_constructor('!Ref', aws_ref)
example_yaml = "Name: !Join [' ', ['EMR', !Ref 'Environment', !Ref 'Purpose']]"
pprint(yaml.load(example_yaml))
К сожалению, это приводит к ошибке.
...
joinables = list(join_args)[1]
IndexError: list index out of range
Добавление print('What I am: '+str(join_args))
к aws_join
показывает, что я получаю генератор:
What I am: <generator object SafeConstructor.construct_yaml_seq at 0x1082ece08>
Вот почему я попытался преобразовать генератор в список. Генератор в конечном итоге заполняется правильно, но я не успеваю его использовать. Если я изменю свою функцию aws_join
на такую:
def aws_join(loader, node):
join_args = loader.construct_yaml_seq(node)
return join_args
Тогда окончательный результат будет выглядеть так:
{'Name': [' ', ['EMR', '{Environment}', '{Purpose}']]}
Так что необходимые части моей функции есть, но не тогда, когда они мне нужны в моей функции.