python - 使用带有 Yaml 文件的 Python f 字符串?

标签 python yaml python-3.6 f-string

如果我有一个 yaml 文件,其中包含一个带有括号符号 {} 的字符串,它与 python f-strings 一起使用,那么在这里如何利用 f-string 插值?以这个简单的 yaml 文件为例:

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

x = 'val3' , 我希望 k2 的值反射(reflect) 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-strings 做同样的事情呢?

最佳答案

您可以定义自定义构造函数:

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_constructoru'tag:yaml.org,2002:str'作为标签。这将使用您的默认字符串构造函数覆盖。

关于python - 使用带有 Yaml 文件的 Python f 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53037758/

相关文章:

python - 为什么在 Python 3.6 中计算 f"\{10}"时符号 '{' 仍然存在?

python - 字典的三元运算

python - 为什么 if block 在 else 之后执行?

python - PyYAML 自动将某些键转换为 bool 值

ruby-on-rails-3 - 最新 Rails 3:ActionView::Template::Error(无法解析第 105 行第 13 列的 YAML)

python - ruamel.yaml - 缩进序列不起作用?

python - 如何注释 f(*params)?

python - pandas groupby 获得前 5% 分数

python - 为什么我们必须在深度神经网络中嵌入列,而不是在 tensorflow 的线性分类器中嵌入列?

python - 用于解压缩带有大括号抑制的列表的 f-string 语法