AST (Abstract Syntax Tree) Nedir? Python'da AST İşleme
AST (Abstract Syntax Tree) Nedir? Python'da AST İşleme
AST (Abstract Syntax Tree) Tanımı
Abstract Syntax Tree (Soyut Sözdizim Ağacı), programlama dillerinde kaynak kodun yapısal bir temsilidir. Kodun sözdizimsel yapısını hiyerarşik bir ağaç yapısı şeklinde gösterir. Derleyiciler ve yorumlayıcılar, kaynak kodu işlerken önce AST oluşturur, ardından bu ağacı kullanarak kodun anlamını analiz eder ve çalıştırır.
Python'da AST Modülü
Python, ast
adında yerleşik bir modül sunar. Bu modül, Python kodunu AST'ye dönüştürmemizi ve bu ağacı analiz etmemizi sağlar.
Temel Kullanım
import ast
# Python kodunu AST'ye dönüştürme
code = """
def merhaba(isim):
print(f"Merhaba, {isim}!")
"""
tree = ast.parse(code)
print(ast.dump(tree, indent=4))
Bu kod, verilen Python kodunun AST temsilini oluşturur ve ağaç yapısını ekrana yazdırır.
AST Düğüm Türleri
Python AST'sinde birçok düğüm türü bulunur. İşte bazı temel örnekler:
Module
: Kök düğümFunctionDef
: Fonksiyon tanımıCall
: Fonksiyon çağrısıName
: Değişken adıConstant
: Sabit değer
AST'yi Gezme ve Değiştirme
AST ağacını gezmek ve değiştirmek için ast.NodeVisitor
ve ast.NodeTransformer
sınıflarını kullanabiliriz.
NodeVisitor Örneği
class FonksiyonZiyaretçisi(ast.NodeVisitor):
def visit_FunctionDef(self, node):
print(f"Fonksiyon bulundu: {node.name}")
self.generic_visit(node)
ziyaretçi = FonksiyonZiyaretçisi()
ziyaretçi.visit(tree)
NodeTransformer Örneği
class PrintDegistirici(ast.NodeTransformer):
def visit_Print(self, node):
# Eski style print'i yeni style print ile değiştir
return ast.Expr(value=ast.Call(
func=ast.Name(id='print', ctx=ast.Load()),
args=node.values,
keywords=[]
))
yeni_agac = PrintDegistirici().visit(tree)
AST Kullanım Senaryoları
Kod Analizi: Kodun karmaşıklığını ölçme, bağımlılıkları analiz etme
Kod Dönüşümü: Bir formattan başka bir formata dönüştürme
Linter'lar: Kod stilini kontrol etme
Test Araçları: Test kapsamını analiz etme
Güvenlik Tarayıcıları: Potansiyel güvenlik açıklarını tespit etme
Örnek: Basit Bir Kod Analizörü
import ast
class KodAnalizörü(ast.NodeVisitor):
def __init__(self):
self.fonksiyon_sayisi = 0
self.degiskenler = set()
def visit_FunctionDef(self, node):
self.fonksiyon_sayisi += 1
self.generic_visit(node)
def visit_Name(self, node):
if isinstance(node.ctx, ast.Store):
self.degiskenler.add(node.id)
self.generic_visit(node)
kod = """
x = 10
y = 20
def topla(a, b):
return a + b
def çıkar(a, b):
return a - b
"""
ağaç = ast.parse(kod)
analizör = KodAnalizörü()
analizör.visit(ağaç)
print(f"Toplam fonksiyon sayısı: {analizör.fonksiyon_sayisi}")
print(f"Kullanılan değişkenler: {analizör.degiskenler}")
Sonuç
Python'un ast
modülü, kod analizi ve manipülasyonu için güçlü bir araç sunar. AST'yi anlamak, Python kodunun nasıl çalıştığını daha derinden kavramanızı sağlar ve gelişmiş araçlar geliştirmenize olanak tanır.