首页 > 解决方案 > 是否可以像使用字符串和格式一样重用 f 字符串?

问题描述

我想创建一个可以多次使用的 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

标签: pythonpython-3.xf-string

解决方案


你不能。

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……但这是一个糟糕的主意。


推荐阅读