Как заменить имя переменной значением в Python AST? - PullRequest
0 голосов
/ 08 апреля 2019

Я хочу, чтобы мои пользователи могли вводить арифметические выражения в командной строке в синтаксисе 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, думая, что одним из них может быть необходимое мне выражение, но пока безуспешно.

Что такое пример кода, который делает эту работу?

1 Ответ

0 голосов
/ 16 июля 2019

Я звонил ast.parse с неправильными аргументами. Правильный вызов

tree = ast.parse('a+b', '', eval)

(см. Комментарий выше.)

...