все Python 3astпонятие
ast.NodeVisitor
вспомогательные функции
Базовый класс обхода дерева: visit(node) вызывает метод visit_<ИмяКласса> или generic_visit, если такого нет.
Синтаксис
class V(ast.NodeVisitor):
def visit_Name(self, node): ...
V().visit(tree)
Главная ловушка: если вы определили visit_FunctionDef, дочерние узлы этой функции больше не обходятся — вложенные функции и вызовы внутри пропадут, пока вы сами не вызовете self.generic_visit(node). Значение, возвращённое visit_*, отдаётся только из visit верхнего уровня; generic_visit его выбрасывает. Для замены узлов нужен NodeTransformer, а методы visit_Num и visit_Str в 3.14 больше не вызываются — используйте visit_Constant.
Примеры
import ast
class Funcs(ast.NodeVisitor):
def __init__(self):
self.names = []
def visit_FunctionDef(self, node):
self.names.append(node.name)
src = 'def outer():\n def inner(): pass'
v = Funcs()
v.visit(ast.parse(src))
print(v.names) # → ['outer'] — inner потерян
import ast
class Funcs(ast.NodeVisitor):
def __init__(self):
self.names = []
def visit_FunctionDef(self, node):
self.names.append(node.name)
self.generic_visit(node)
v = Funcs()
v.visit(ast.parse('def outer():\n def inner(): pass'))
print(v.names) # → ['outer', 'inner']
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности