Я думаю, что только что нашел это. используя 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
.