Вы получаете целое дерево таким образом - вплоть до самого дна - но оно сохраняется как дерево, точно ... поэтому на каждом уровне, чтобы получить дочерние элементы, вы должны явно посетить необходимые атрибуты , Например (я называю compile
результат cf
, а не ast
, потому что это скрыло бы стандартный модуль библиотеки ast - я предполагаю, что у вас только 2,5, а не 2,6, поэтому вы используете нижний -уровень _ast
модуль вместо?) ...:
>>> cf.body[0].names[0].name
'os'
Это то, что говорит вам, что оператор импорта импортирует имя os
(и это только потому, что 1 - это длина поля .names
поля .body[0]
, которое является import
).
В модуле Python 2.6 ast
вы также получите помощников, которые позволят вам более легко перемещаться по дереву (например, с помощью шаблона проектирования Visitor
), но все дерево присутствует в версии 2.5 (с * 1016). *) или 2.5 (с ast
), и в любом случае представляется одинаково.
Для удобного посещения всех узлов дерева в 2.6, используйте модуль ast (без начального подчеркивания) и подкласс ast.NodeVisitor
в зависимости от ситуации (или эквивалентно используйте ast.iter_child_nodes
рекурсивно и ast.iter_fields
при необходимости). Конечно, эти помощники могут быть реализованы на чистом Python поверх _ast
, если вы по какой-то причине застряли в 2.5.