CodeBlanks Logo Icon CodeBlanks

NodeTransformer

ast.NodeTransformer ile dönüşümü öğrenirsin.

NodeTransformer nedir?

ast.NodeTransformer, NodeVisitor'ın dönüşüm yapan kardeşidir. visit_ yöntemleri bir düğüm alıp değiştirilmiş veya yeni bir düğüm döndürür.

Örneğin visit_Constant içinde return ast.Constant(value=node.value * 2) yazarsan, tüm sabitler iki katına çıkar. Dönüşümden sonra ast.fix_missing_locations(tree) çağrısı satır numaralarını onarır; bu, compile ve exec için gereklidir. Bu desen, kod optimizasyonu ve dönüştürme araçlarının temelidir.

visit_ ile düğüm değiştirme

Bir NodeTransformer'da visit_ yöntemi üç şey yapabilir: aynı düğümü döndürmek (değişiklik yok), yeni bir düğüm döndürmek (değiştir) veya None döndürmek (sil).

Yeni düğüm oluştururken ast.Constant(value=...) gibi kurucular kullanırsın. Dönüştürme tamamlandıktan sonra ast.fix_missing_locations(tree) çağrısı satır bilgisini onarır. Bu adımı atlarsan compile hata verir. Bu nedenle dönüşüm ve derleme arasında her zaman bu çağrı yapılır.

Uygulama NodeTransformer ile değiştir

import ast ile modülü içe aktar. NumberDoubler(ast.NodeTransformer) sınıfı yaz. visit_Constant(self, node) içinde isinstance(node.value, int) ise ast.Constant(value=node.value * 2) döndür; değilse node döndür. ast.parse("x = 5") ile ağacı oluştur, NumberDoubler().visit(tree) ile dönüştür, ast.fix_missing_locations(tree) çağır. Boş bir ns = {} sözlüğü içinde exec(tree, ns) yap ve ns["x"]'i yazdır.

Başlangıç kodu

main.py
# sayı katlayıcı yaz
# ağacı dönüştür ve çalıştır
# sonucu yazdır

Örnek çözüm

main.py
import ast

class NumberDoubler(ast.NodeTransformer):
    def visit_Constant(self, node):
        if isinstance(node.value, int):
            return ast.Constant(value=node.value * 2)
        return node

tree = ast.parse("x = 5")
NumberDoubler().visit(tree)
ast.fix_missing_locations(tree)
ns = {}
exec(tree, ns)
print(ns["x"])

Beklenen çıktı

10

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 NodeTransformer ne döndürür?

main.py
class D(ast.NodeTransformer):
    def visit_Constant(self, node):
        return ast.Constant(value=0)
  • Hiçbir şey (None)
  • Bir liste
  • Yeni veya değiştirilmiş düğüm Doğru cevap
  • Mevcut düğümü değiştirmeden

Açıklama: yeni veya değiştirilmiş düğüm. Transformer, visit_ yönteminden düğüm döndürür.

2 NodeTransformer tanımını tamamla

Soru
class Doubler(____):
    def visit_Constant(self, node):
        return node
Cevap
class Doubler(ast.NodeTransformer):
    def visit_Constant(self, node):
        return node

Açıklama: Dönüştürücü ast.NodeTransformer'dan türetilir.

3 NodeTransformer kavramlarını eşleştir

Kavram Anlamı
NodeTransformer Düğüm değiştirir
visit_Constant Sabit düğüm
fix_missing_locations Satır onarır
return node Aynı kalır

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