更新:Python 3.6 已经内置了这个功能(一个更强大的变量):
x, y, z = range(3)
print(f"{x} {y + z}")
请参考PEP 0498 -- 字面字符串插值
手动解决方案(manual solution)在嵌套函数中会导致一些令人惊讶的行为:
from callerscope import format
def outer():
def inner():
nonlocal a
try:
print(format("{a} {b}"))
except KeyError as e:
assert e.args[0] == 'b'
else:
assert 0
def inner_read_b():
nonlocal a
print(b)
try:
print(format("{a} {b}"))
except KeyError as e:
assert 0
a, b = "ab"
inner()
inner_read_b()
注意:同一次调用的成功或失败取决于变量是否在其上方或下方被提及。
其中,
callerscope
指:
import inspect
from collections import ChainMap
from string import Formatter
def format(format_string, *args, _format=Formatter().vformat, **kwargs):
caller_locals = inspect.currentframe().f_back.f_locals
return _format(format_string, args, ChainMap(kwargs, caller_locals))
locals()
或globals()
。 - Facundo Cascointerpolate("...", **locals())
看起来很凌乱,而且在s
是局部变量的罕见情况下会失败,因为它尝试两次设置第一个参数。 - Eric