NodeVisitor
- Python kursu
- Uzman
- Ders 15/47
- 5 dk
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.
Başlangıç kodu
# isim toplayıcı yaz
# ağacı gez ve isimleri topla
# sonucu yazdırÖrnek çözüm
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)Beklenen çıktı
['x', 'y']
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 NodeVisitor tanımını tamamla
class Collector(____):
pass
class Collector(ast.NodeVisitor):
pass
Açıklama: Bir ziyaretçi ast.NodeVisitor'dan türetilir.
2 NodeVisitor kavramlarını eşleştir
| Kavram | Anlamı |
|---|---|
visit_Name |
Ad düğümleri |
generic_visit |
Alt düğümlere iner |
NodeVisitor |
Ziyaretçi temeli |
node.id |
Ad metni |
3 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 Doğru cevap
- Yalnızca sınıf tanımlanınca
- Program başlarken
- Yalnızca hata durumunda
Açıklama: visit_Name, ziyaretçi bir Name düğümüne rastlayınca otomatik çağrılır.