是否可以像使用字符串和格式一样重用 f 字符串?

Is it possible to reuse an f-string as it is possible with a string and format?

我想创建一个可以多次使用的 f 字符串,如下面的代码 format:

TEXT_AMOUNT = 'text {amount}'


def f1(beginning):
    return beginning + TEXT_AMOUNT.format(amount=10)


def f2(ending):
    return TEXT_AMOUNT.format(amount=100) + ending

如何使用 f 弦实现相同的功能?我试过了:

TEXT_AMOUNT = f'text {amount}'


def f1(beginning):
    amount = 100
    return beginning + TEXT_AMOUNT


def f2(ending):
    amount = 10
    return TEXT_AMOUNT + ending

但是,我收到以下错误:

NameError: name 'amount' is not defined

你不能。

f 字符串不是一种字符串,它是一种立即计算的字符串文字。您不能将 f-string 存储在变量中以供稍后评估,也不能从用户那里接受 f-string,等等。1 这是它们安全的唯一原因。

那么,如果您确实想要多次使用一种格式(或从用户那里获取的格式等)怎么办?您使用 str.format.

有时,您需要以与 f 字符串相同的方式捕获所有局部变量和全局变量,但要明确地进行。因为这是一种罕见的情况(并且可能是一个安全漏洞),所以它故意有点难看:

TEXT_AMOUNT = 'text {amount}'

def f1(beginning):
    amount = 100
    return beginning + TEXT_AMOUNT.format(**locals(), **globals())

这会让您思考您正在写的内容——您真的不想 globals 在这里,对吧?所以把它关掉。它还向 reader 发出信号——如果你正在拉入 locals,他们会希望看到该字符串在你的源代码中确实是一个常量,没有做任何危险的事情。


1.好吧,您 可以 在传递给 eval 的字符串中使用 f 字符串,但这是一个糟糕的主意。

但您可以将 f-string 放入函数中并以这种方式重用它

def TEXT_AMOUNT(amount):
    return f'text {amount}'

def f1(beginning):
    return beginning + " " + TEXT_AMOUNT(amount=10)

def f2(ending):
    return TEXT_AMOUNT(amount=100) + " " + ending

print(f1("first"))
print(f2("last"))

第一条文字 10

最后发短信 100

您可以将其存储为 lambda 函数:

TEXT_AMOUNT = lambda amount: f'text {amount}'
print(TEXT_AMOUNT(10))

out: 'text 10'