Python 如何使用ast.literal\u eval计算f字符串

Python 如何使用ast.literal\u eval计算f字符串,python,string,python-3.6,Python,String,Python 3.6,尝试使用计算f字符串时,我得到一个关于“格式错误的节点或字符串”的ValueError: 引发以下错误: --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <...> in <module>() 3 a = 1

尝试使用计算f字符串时,我得到一个关于“格式错误的节点或字符串”的
ValueError

引发以下错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<...> in <module>()
      3 a = 10
      4 
----> 5 literal_eval("f'test {a}'")

C:\...\lib\ast.py in literal_eval(node_or_string)
     83                     return left - right
     84         raise ValueError('malformed node or string: ' + repr(node))
---> 85     return _convert(node_or_string)
     86 
     87 

C:\...\lib\ast.py in _convert(node)
     82                 else:
     83                     return left - right
---> 84         raise ValueError('malformed node or string: ' + repr(node))
     85     return _convert(node_or_string)
     86 

ValueError: malformed node or string: <_ast.JoinedStr object at 0x000001F20CE718D0>

我可以让
ast.literal\u eval
处理f字符串吗?如果是,我需要更改什么?

这是不可能的。f字符串有点像下面的1:

这实际上是一种戏剧性的轻描淡写——f-strings还支持其他类型的表达式,这些表达式不仅仅是名称查找或简单的东西,比如使用普通格式字符串可以获得的条目访问。e、 它们支持任何其他有效的python表达式,包括函数调用、数学公式等

>>> expr = '"boom"'
>>> f'foo{eval(expr)}'
'fooboom'
f字符串使用
\uuuuu格式
协议进行求值,它包含的表达式使用普通python进行求值。这意味着f字符串不能是文本。这是一种表情。请注意,与任何任意表达式一样,它无法安全地进行计算——因此您可能甚至不希望它通过
ast.literal\u eval
进行“可评估”


1在AST中,您将看到它是通过
JoinedStr
Str
FormattedValue
AST节点完成的。其中,唯一可以被视为文字的是
Str

F字符串可以包含任意复杂的表达式。一个简单的例子

>>> a = 2; b=3; print(f'x{a**b}x')
x8x


它们既不是文字,也不是类似文字,不适合文字评估。

f'test{a}
不是文字。它执行一个计算(格式化U值操作码)。您的代码涵盖了f字符串的常用用法(名称插值),足以解释M的故障。但它不允许在大括号之间或{和:}之间出现复杂表达式,实际等效的表达式更像
process(string).format(,…)
where
process
提取表达式,以便在简化字符串之外对其求值。@TerryJanReedy--是的。我有一个脚注,试图解释f字符串不仅仅是名称查找的语法糖。我认为我做得不够清楚,所以我尝试重新编写文本a b希望它能让事情变得更清楚。。。
map = {}
map.update(globals())
map.update(locals())
string.format(**map)
>>> expr = '"boom"'
>>> f'foo{eval(expr)}'
'fooboom'
>>> a = 2; b=3; print(f'x{a**b}x')