ast.literal_eval 电源支持

问题描述 投票:0回答:2

如何安全评估用户输入的功率等数学表达式? 尝试使用

ast.literal_eval
但它引发了异常。

>>> import ast
>>> ast.literal_eval('2**2')
ValueError: malformed node or string: <_ast.BinOp object at ...>
python-3.x eval
2个回答
2
投票

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

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


2
投票

您可以使用

seval
包进行算术运算和文字安全评估。

>>> import seval
>>> seval.safe_eval('2 ** 2')
4
© www.soinside.com 2019 - 2024. All rights reserved.