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

时间:2018-09-09 21:26:41

标签: python python-3.x f-string

我想创建一个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

3 个答案:

答案 0 :(得分:4)

你不能。

f字符串不是一种字符串,它是一种字符串文字,将立即对其求值。您无法将f字符串存储在变量中以供日后评估,也不能接受用户的字符串,等等。 1 这是它们安全的唯一原因。

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

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

TEXT_AMOUNT = 'text {amount}'

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

这使您考虑自己在写什么—您真的不想在这里globals,对吗?所以就别说了。而且它还向读者发出信号-如果您输入locals,他们将希望看到字符串在您的来源中确实是一个常量,不会做任何危险的事情。


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

答案 1 :(得分:0)

但是您可以将f字符串放入函数中并以这种方式重复使用

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个文本

答案 2 :(得分:0)

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

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

out: 'text 10'