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