ast.literal_eval电源支持

时间:2019-06-17 08:13:41

标签: python-3.x eval

如何安全地评估用户输入的数学表达式(例如功率)? 使用ast.literal_eval进行了尝试,但会引发异常。

>>> import ast
>>> ast.literal_eval('2**2')
ValueError: malformed node or string: <_ast.BinOp object at ...>

2 个答案:

答案 0 :(得分:1)

ast.literal_eval(尽管它实际上支持加法和减法)仅用于评估文字。为了安全地评估数学表达式,您应该使用ast.parse(some_expression, mode="eval")自己构造AST,并使用ast.walk()检查它是否仅包含文字和数学运算。要评估AST,请使用eval(compile(the_ast, "<string>", "eval"))之类的东西。

有关此AST的更多信息,请访问此网站:https://greentreesnakes.readthedocs.io/

答案 1 :(得分:0)

您可以使用seval软件包进行算术运算和文字安全评估。

>>> import seval
>>> seval.safe_import('2 ** 2')
4