我正在寻找一种安全的方法来评估简单的算术表达式。我知道让eval()
“更安全”的困难,但后来我了解了ast.literal_eval()
我尝试了它,使用以下示例:
>>> ast.literal_eval("1+1")
2
尼斯!现在尝试1次1 ...
>>> ast.literal_eval("1*1")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/jldiaz/miniconda3/lib/python3.6/ast.py", line 85, in literal_eval
return _convert(node_or_string)
File "/home/jldiaz/miniconda3/lib/python3.6/ast.py", line 84, in _convert
raise ValueError('malformed node or string: ' + repr(node))
ValueError: malformed node or string: <_ast.BinOp object at 0x7fac8830aa58>
这是什么意思?畸形的弦?但是它可以无错误地解析:
>>> result = ast.parse("1*1")
>>> ast.dump(result)
'Module(body=[Expr(value=BinOp(left=Num(n=1), op=Mult(), right=Num(n=1)))])'
AST看起来没问题,要执行的操作是Mult()
。然而它失败了。显然,这是失败的操作,因为第一次成功实验的AST是相同的,只有op=Add()
。
我尝试了其他操作。除法(/
),整数除法(//
)和模(%
)都失败了。只有添加(+
)和减法(-
)似乎有效。
我错过了什么吗?令人惊讶的是,我无法找到有关此问题或ast.literal_eval()