Генерация ast из составляющих элементов без использования ast.parse в python - PullRequest
0 голосов
/ 21 марта 2020

Используя модуль python ast, можно создать простое абстрактное синтаксическое дерево следующим образом:

import ast
module = ast.parse('x=3')

. Создается объект Module, для которого можно получить исходный код. используя библиотеку astor следующим образом:

import astor
astor.to_source(module)

Генерация вывода

'x = 3\n'

Возможно ли составить точно такой же объект модуля из его составных элементов без использования ast.parse метод такой, что метод astor.to_source может генерировать тот же исходный код? если так как?

1 Ответ

0 голосов
/ 21 марта 2020

Я думаю, что только что нашел это. используя ast.dump, можно проверить содержимое дерева следующим образом:

import astor, ast
module = ast.parse('x=3')
ast.dump(module)

Это приводит к следующему выводу, раскрывающему основную структуру:

"Module(body=[Assign(targets=[Name(id='x', ctx=Store())], value=Num(n=3))])"

Мы можем использовать эту информацию для создания того же дерева с нуля, а затем используйте astor для восстановления источника:

module = ast.Module(body=[ast.Assign(targets=[ast.Name(id='x', ctx=ast.Store())], value=ast.Num(n=3))])
astor.to_source(module)

, который выводит следующее:

'x = 3\n'

Однако существует одна проблема, поскольку выполнение этого нового дерева приводит к ошибке:

exec(compile(module, filename='<ast>', mode="exec"))

Traceback (последний вызов был последним): файл "", строка 1, в TypeError: обязательное поле "lineno" отсутствует в stmt

Для исправления этого необходимо добавить номера строк к каждому узлу, используя метод ast.fix_missing_locations.

...