Python
NodeVisitor
ast.NodeVisitor ile ziyaretçi desenini öğrenirsin.
NodeVisitor nedir?
ast.NodeVisitor, AST'yi düzenli biçimde gezmek için bir sınıftır. visit_<tür> yöntemlerini ezip her düğüm türü için özel davranış yazarsın.
Örneğin def visit_Name(self, node) tanımlarsan, ziyaretçi her Name düğümünde bu yöntemi çağırır. self.generic_visit(node) çağrısı alt düğümlere de inilmesini sağlar; bunu unutursan derinlik taranmaz. Bu desen, tür bazlı işleme gereken araçlar için idealdir: bir linter, her Call düğümünde uyarı verebilir.
visit_ yöntemleri
Her düğüm türü için visit_<tür> yöntemi tanımlarsın. Python, bir düğüme rastlayınca tür adına bakarak ilgili yöntemi çağırır.
Örneğin visit_Name Name düğümlerinde, visit_Constant sabit değer düğümlerinde çalışır. Yöntem içinde node.id veya node.value gibi alanlara erişirsin. self.generic_visit(node) çağrısı alt düğümlere inmeyi sürdürür; bunu yazmazsan ziyaretçi o dalda durur. Birden fazla visit_ yöntemi tanımlayarak karmaşık analizler yapabilirsin.
Uygulama NodeVisitor ile isim topla
import ast ile modülü içe aktar. NameCollector(ast.NodeVisitor) sınıfı yaz. __init__ içinde self.names = [] tanımla. visit_Name(self, node) içinde self.names.append(node.id) yap ve self.generic_visit(node) çağır. ast.parse("x = 1\ny = 2") ile ağacı oluştur, ziyaretçiyi .visit(tree) ile çalıştır, names listesini yazdır.
Örnek çözümü göster
import ast
class NameCollector(ast.NodeVisitor):
def __init__(self):
self.names = []
def visit_Name(self, node):
self.names.append(node.id)
self.generic_visit(node)
tree = ast.parse("x = 1\ny = 2")
c = NameCollector()
c.visit(tree)
print(c.names)
Kendini test et
-
NodeVisitor tanımını tamamla
class Collector(____):
pass
Cevabı göster
class Collector(ast.NodeVisitor):
pass
-
NodeVisitor kavramlarını eşleştir
- visit_Name
- Ad düğümleri
- generic_visit
- Alt düğümlere iner
- NodeVisitor
- Ziyaretçi temeli
- node.id
- Ad metni
-
visit_Name ne zaman çağrılır?
class C(ast.NodeVisitor):
def visit_Name(self, node):
print(node.id)
tree = ast.parse("x = 1")
C().visit(tree)
- Her Name düğümünde otomatik
- Yalnızca sınıf tanımlanınca
- Program başlarken
- Yalnızca hata durumunda
Cevabı göster
Her Name düğümünde otomatik — visit_Name, ziyaretçi bir Name düğümüne rastlayınca otomatik çağrılır.
Sıradaki ders: NodeTransformer