Использовать Python f-строки с файлами Yaml? - PullRequest
0 голосов
/ 29 октября 2018

Если у меня есть файл yaml, содержащий строку с нотацией в скобках {}, используемую совместно с f-строками python, как можно использовать здесь интерполяцию f-строки?Возьмем, к примеру, этот простой файл yaml:

# tmp.yaml
k1: val1
k2: val2 as well as {x}

Если x = 'val3', я бы хотел, чтобы значение k2 отражало val2 as well as val3

# app.py
x = 'val3'
with open('tmp.yaml', 'rt') as f:
    conf = yaml.safe_load(f)

print(conf)
{'k1': 'val1', 'k2': 'val2 as well as {x}'}

Это можно сделать довольно легкос форматными строками ...

print(conf['k2'].format(x=x))
val2 as well as val3

Но как сделать то же самое с f-строками?

1 Ответ

0 голосов
/ 29 октября 2018

Вы можете определить пользовательский конструктор:

import yaml

values = { 'x': 'val3' }

def format_constructor(loader, node):
  return loader.construct_scalar(node).format(**values)

yaml.SafeLoader.add_constructor(u'!format', format_constructor)

conf = yaml.safe_load("""
k1: val1
k2: !format val2 as well as {x}
""")

print(conf)

Если вы не хотите использовать тег !format, вы также можете использовать add_constructor с u'tag:yaml.org,2002:str' в качестве тега.Это заменит строковый конструктор по умолчанию на ваш.

...