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
4

3 回答 3

13

你不能。

f-string 不是一种字符串,它是一种字符串文字,它会立即被评估。您不能将 f 字符串存储在稍后评估的变量中,或者接受来自用户的变量等。1这是它们安全的唯一原因。

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

有时,您需要像 f-string 一样捕获所有局部变量和全局变量,但要明确地进行。因为这是一种罕见的情况(并且可能是一个安全漏洞),所以故意有点难看:

TEXT_AMOUNT = 'text {amount}'

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

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


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

于 2018-09-09T21:31:22.573 回答
9

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

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

out: 'text 10'
于 2019-10-31T00:55:08.780 回答
7

但是您可以将 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 最后

于 2019-05-09T15:01:01.927 回答