Python 如何使用ast.literal\u eval计算f字符串
尝试使用计算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
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(,…)
whereprocess
提取表达式,以便在简化字符串之外对其求值。@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')