NodeTransformer
- Python kursu
- Uzman
- Ders 16/47
- 5 dk
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
# sayı katlayıcı yaz
# ağacı dönüştür ve çalıştır
# sonucu yazdırÖrnek çözüm
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?
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
class Doubler(____):
def visit_Constant(self, node):
return node
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 |