Python Glossary English

все 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Сообщить о неточности