Это способ сделать это, даже если я категорически не одобряю этот подход в производственной ситуации (следует избегать eval
, ввод данных должен быть продезинфицирован и т. Д.). Идея состоит в том, чтобы выполнить подстановку s, перебирая переменные в yaml, в предположении, что выражение yaml (в result
) следует тому же соглашению об именах. Вот образец:
#!/usr/bin/env python
import yaml
VARS_YAML = """
x: 2
y: 3
z: 5
"""
EXPR_YAML = """
result: (x + y) * z
"""
vars = yaml.load(VARS_YAML)
expr = yaml.load(EXPR_YAML)
for key, value in vars.items(): # for python2: vars.iteritems()
expr['result'] = expr['result'].replace(key, str(value))
r = eval(expr['result'])
print(r) # for python2: print r
# => 25
Этот код предназначен для python-3 (единственная версия, которая у меня есть на данный момент), но его просто перенести в python-2 (я думаю, что это ваша версия). Если вы предпочитаете загружать yaml из файла:
with open('var.yaml', 'r') as var_file:
vars = yaml.load(var_file)
более чем достаточно.