CodeBlanks Logo Icon CodeBlanks

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.

Başlangıç kodu

main.py
# isim toplayıcı yaz
# ağacı gez ve isimleri topla
# sonucu yazdır

Örnek çözüm

main.py
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

Soru
class Collector(____):
    pass
Cevap
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?

main.py
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.

Uzman bölümündeki tüm dersler