在`ast.literal_eval()`中的操作

时间:2018-02-23 12:42:00

标签: python eval abstract-syntax-tree

我正在寻找一种安全的方法来评估简单的算术表达式。我知道让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()

支持的操作的任何信息

0 个答案:

没有答案