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