Я хочу, чтобы мои пользователи могли вводить арифметические выражения в командной строке в синтаксисе Python и заменять имена переменных на значения во время выполнения. Я не хочу просто использовать eval
, я хочу использовать Абстрактные деревья синтаксиса .
Например, скажем, я хочу переписать каждую переменную в AST со значением 3.5
, а затем оценить его. Прочитав документацию, я придумал это.
import ast
class RewriteName(ast.NodeTransformer):
def visit_Name(self, node):
return ast.copy_location(ast.Num(n=3.5, ctx=node.ctx), node)
tree = ast.parse('a + b', 'eval')
tree = RewriteName().visit(tree)
ast.fix_missing_locations(tree)
o = compile(tree, '<string>', 'eval')
print(eval(o))
Я хочу, чтобы это напечатало 7.0
, но вместо этого я получаю следующую ошибку.
o = compile(tree, '<string>', 'eval')
TypeError: expected Expression node, got Module
Я понимаю, что АСТ сбивает с толку номенклатуру о Expression
против Expr
, но мне не удалось найти пример того, как разобраться в этом. Я пробовал различные аргументы compile
, включая запуск его на различных подузлах tree
, думая, что одним из них может быть необходимое мне выражение, но пока безуспешно.
Что такое пример кода, который делает эту работу?