首页 > 解决方案 > 如何将变量评估为 Python f 字符串

问题描述

我想要一种机制来评估一个 f 字符串,其中要评估的内容是在一个变量中提供的。例如,

x=7
s='{x+x}'
fstr_eval(s)

对于我想到的用例,字符串s可能来自用户输入(用户信任的地方eval)。

虽然eval在生产中使用通常是非常糟糕的做法,但也有明显的例外。例如,用户可能是在本地机器上工作的 Python 开发人员,他想使用完整的 Python 语法来开发 SQL 查询。

关于重复的注意事项:这里这里有类似的问题。第一个问题是在模板的有限上下文中提出的。第二个问题虽然与这个问题非常相似,但已被标记为重复。因为这个问题的上下文与第一个问题有很大不同,所以我决定根据第二个问题之后自动生成的建议提出第三个问题:

这个问题之前有人问过,并且已经有了答案。如果这些答案不能完全解决您的问题,请提出一个新问题。

标签: pythonpython-3.xpython-3.6string-interpolationf-string

解决方案


即使是受信任的用户,使用eval也只能是最后的手段。

如果您愿意牺牲语法的灵活性以获得更多的安全性和控制力,那么您可以使用str.format并提供您的整个范围。

这将不允许对表达式进行评估,但单个变量将被格式化为输出。

代码

x = 3
y = 'foo'

s = input('> ')
print(s.format(**vars()))

例子

> {x} and {y}
3 and foo

推荐阅读