如何安全评估用户输入的功率等数学表达式? 尝试使用
ast.literal_eval
但它引发了异常。
>>> import ast
>>> ast.literal_eval('2**2')
ValueError: malformed node or string: <_ast.BinOp object at ...>
ast.literal_eval
(尽管它实际上支持加法和减法)仅用于评估文字。为了安全地计算数学表达式,您应该使用 ast.parse(some_expression, mode="eval")
自行构建 AST,并使用 ast.walk()
检查它是否只包含文字和数学运算。要评估 AST,请使用类似 eval(compile(the_ast, "<string>", "eval"))
的内容。
有关 AST 的更多信息,请参阅此网站:https://greentreesnakes.readthedocs.io/
您可以使用
seval
包进行算术运算和文字安全评估。
>>> import seval
>>> seval.safe_eval('2 ** 2')
4