поддержка ast.literal_eval - PullRequest
       12

поддержка ast.literal_eval

0 голосов
/ 17 июня 2019

Как безопасно оценить вводимые пользователем математические выражения, такие как мощность?Пробовал использовать ast.literal_eval, но возникает исключение.

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

Ответы [ 2 ]

1 голос
/ 17 июня 2019

ast.literal_eval (хотя на самом деле он поддерживает сложение и вычитание) предназначен только для оценки литералов. Чтобы безопасно оценивать математические выражения, вы должны сами построить AST, используя ast.parse(some_expression, mode="eval"), и проверить, содержит ли он только литералы и математические операции, используя ast.walk(). Для оценки AST используйте что-то вроде eval(compile(the_ast, "<string>", "eval")).

Смотрите этот сайт для получения дополнительной информации о AST: https://greentreesnakes.readthedocs.io/

0 голосов
/ 21 июня 2019

Вы можете использовать пакет seval для арифметических операций и оценки литералов.

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