是否可以像使用字符串和格式一样重用 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'
我想创建一个可以多次使用的 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'