Получение родительского узла AST в Python

Я работаю с абстрактными деревьями Синтаксиса в Python 3. The ast библиотека дает много способов получить дочерние узлы узла (вы можете использовать iter_child_nodes() или walk()), но нет способа получить родитель одного. Кроме того, каждый узел имеет ссылки на своих потомков, но он не имеет ссылок на своего родителя.

как я могу получить родителя узла AST если я не хочу писать какой-то плагин для ast библиотеки?

какой самый правильный способ сделать это?

3 ответов


вы можете создать некоторую хэш-таблицу, связывающую узлы AST с узлами AST, и сканировать (рекурсивно) самое верхнее дерево AST, чтобы зарегистрировать в этой хэш-таблице родителя каждого узла.


вот собственно код:

for node in ast.walk(root):
    for child in ast.iter_child_nodes(node):
        child.parent = node

нет необходимости в хэш-таблице, вы можете просто поставить атрибут непосредственно на узле.


Это не будет действительно плагин, но вы всегда можете написать функцию, которая добавляет weakref к родителю в каждом ребенке.