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

python
Copy
Download
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üğüm

  • FunctionDef: 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

python
Copy
Download
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

python
Copy
Download
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ı

  1. Kod Analizi: Kodun karmaşıklığını ölçme, bağımlılıkları analiz etme

  2. Kod Dönüşümü: Bir formattan başka bir formata dönüştürme

  3. Linter'lar: Kod stilini kontrol etme

  4. Test Araçları: Test kapsamını analiz etme

  5. Güvenlik Tarayıcıları: Potansiyel güvenlik açıklarını tespit etme

Örnek: Basit Bir Kod Analizörü

python
Copy
Download
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.


Yorumlar