如何安全地评估用户输入的数学表达式(例如功率)?
使用ast.literal_eval
进行了尝试,但会引发异常。
>>> import ast
>>> ast.literal_eval('2**2')
ValueError: malformed node or string: <_ast.BinOp object at ...>
答案 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