如何将变量替换为 Python 格式字符串

How to substitute variables into Python format string

我有一个像这样的 Python 字符串:

template = '{a} or {b} but not {c}; {d} and {e}, not {f}'

之后定义了变量abcdef。它们未在 template 之前定义,因此我不能使用 f 字符串文字。我想将它们的值代入 template.

这可以通过使用 .format() 字符串方法来实现:

template.format(a=a, b=b, c=c, d=d, e=e, f=f)

但是,我正在寻找一种更简洁的表达方式。

如果变量是全局变量,则将 **kwargsglobals() 结合使用:

template.format(**globals())

但是,我正在寻找适用于局部变量或全局变量的东西——简洁的东西,它有效地产生与使用 f 字符串文字相同的结果,例如:

template = f'{a} or {b} but not {c}; {d} and {e}, not {f}'

同样,f 字符串在这种情况下不起作用,因为在定义 template 时字母变量尚未定义。

谢谢!

您可以通过这种方式重新创建 f 弦:

result = eval("f'{}'".format(template))

定义完所有变量后就可以使用它了。这基本上是一种更方便的方法 template.format(a=a, b=b, c=c, d=d, e=e, f=f)

您可以使用 locals()。在模块级别,locals()globals() 是同一个字典。

更新:如果一些变量在全局变量中,而其中一些变量在本地变量中,您可以使用新的 | 运算符将它们合并:

template = '{a} or {b} but not {c}; {d} and {e}, not {f}'

a = 10;b = 20;c = 30;d = 40

def fn():
    e = 50;f = 60;h = 70
    print(template.format(**globals() | locals()))
    
fn()

def fn():
    print(template.format(**{**globals(), **locals()}))

本地字典将覆盖全局字典中的值。