Python Dilinde Yapısal Desen Eşleştirme (Structural Pattern Matching) ve Match Deyimi Kullanımı
Python 3.10 ile tanıtılan yapısal desen eşleştirme (structural pattern matching) özelliği, programcılara kodlarını daha okunaklı ve yönetilebilir hale getirme imkanı sunar. Özellikle karmaşık veri yapılarını analiz ederken veya farklı durumları işlerken, match deyimi if/elif/else zincirlerine modern ve güçlü bir alternatif sunar. Bu makale, Python'daki match deyiminin temel prensiplerini, sözdizimini ve çeşitli kullanım senaryolarını detaylı bir şekilde açıklamaktadır.
Sözdizimi
Python'daki match deyiminin temel sözdizimi aşağıdaki gibidir:
match konu:
    case desen_1:
        # desen_1 eşleşirse çalışacak kod
    case desen_2 if koşul:
        # desen_2 eşleşirse ve koşul doğruysa çalışacak kod
    case _:
        # hiçbir desen eşleşmezse çalışacak kod (isteğe bağlı)Detaylı Açıklama
match deyiminin her bir bileşeni belirli bir amaca hizmet eder:
match konu:
konuifadesi, eşleştirme yapılmak istenen herhangi bir Python objesidir. Bu, bir değişken, bir fonksiyon çağrısının sonucu veya doğrudan bir değer olabilir.matchdeyimi, bukonuobjesini sırasıyla tanımlanancasedesenleriyle karşılaştırır.case desen:
Hercasebloğu,konuile eşleştirilmeye çalışılan birdesentanımlar. Desenler çeşitli tiplerde olabilir ve aşağıdaki gibi farklı eşleştirme mekanizmalarını destekler:
Değer Desenleri (Literal Patterns): Sabit değerlerle (sayılar, dizeler,
True,False,None) eşleşir. Örn:case 1:,case "hata":.Yakalama Desenleri (Capture Patterns): Bir değeri bir değişkene atar. Örn:
case x:. Eğerxdaha önce tanımlanmamışsa, eşleşen değerix'e atar. Eğer_kullanılırsa, bu bir wildcard (joker) deseni olarak kabul edilir ve değeri yakalamaz, sadece eşleşir.Sıra Desenleri (Sequence Patterns): Listeler veya tuple'lar gibi sıralı veri yapılarını eşleştirmek için kullanılır. Örn:
case [x, y]:,case (başlangıç, *diğerleri):.Haritalama Desenleri (Mapping Patterns): Sözlükler gibi anahtar-değer çiftlerini içeren veri yapılarını eşleştirmek için kullanılır. Örn:
case {"tip": "hata", "kod": c}:.Sınıf Desenleri (Class Patterns): Belirli bir sınıfın örneklerini eşleştirmek ve bu örneklerin niteliklerine erişmek için kullanılır. Örn:
case Nokta(x=nx, y=ny):.OR Desenleri (OR Patterns): Birden fazla deseni
|operatörü ile birleştirerek, herhangi bir desenin eşleşmesi durumunda kod bloğunun çalışmasını sağlar. Örn:case "a" | "b":.AS Desenleri (AS Patterns): Bir deseni eşleştirirken aynı zamanda eşleşen değeri başka bir değişkene atamak için kullanılır. Örn:
case ["komut", *args] as tüm_komut:.
if koşul:(Guard)
Hercasedeseninin arkasına isteğe bağlı olarak birif koşul:ifadesi eklenebilir. Bu, desenin eşleşmesinin yanı sıra, belirtilen koşulun da doğru olmasını gerektirir. Koşul, desende yakalanan değişkenleri kullanabilir. Örn:case {"yaş": y} if y >= 18:.
Pratik Kullanım Örnekleri
Aşağıdaki örnekler, match deyiminin farklı senaryolarda nasıl kullanılabileceğini göstermektedir.
Örnek 1: Temel Değer Eşleştirme
Bir HTTP durum kodunu işleme:
durum_kodu = 200
match durum_kodu:
    case 200:
        print("OK - İstek başarıyla işlendi.")
    case 404:
        print("Bulunamadı - Kaynak mevcut değil.")
    case 500:
        print("Sunucu Hatası - İç sunucu hatası oluştu.")
    case _: # Joker desen, diğer tüm durumlar için
        print(f"Bilinmeyen durum kodu: {durum_kodu}")Çıktı:
OK - İstek başarıyla işlendi.Örnek 2: Sıra Desenleri ve Yakalama
Bir komut listesini ayrıştırma:
komut = ["yükle", "uygulama.exe", "--sessiz"]
match komut:
    case ["yükle", dosya, *argümanlar]:
        print(f"'{dosya}' yükleniyor. Argümanlar: {argümanlar}")
    case ["sil", dosya]:
        print(f"'{dosya}' siliniyor.")
    case _:
        print("Geçersiz komut.")Çıktı:
'uygulama.exe' yükleniyor. Argümanlar: ['--sessiz']Örnek 3: Haritalama Desenleri ve Koşullu Eşleştirme (Guard)
Bir kullanıcı objesini işleme:
kullanici_verisi = {"ad": "Mehmet", "rol": "admin", "aktif": True}
match kullanici_verisi:
    case {"rol": "admin", "aktif": True}:
        print("Yönetici girişi yapıldı.")
    case {"rol": "editor", "aktif": True, "ad": isim}:
        print(f"Editör '{isim}' giriş yaptı.")
    case {"aktif": False}:
        print("Kullanıcı hesabı pasif.")
    case _:
        print("Bilinmeyen kullanıcı durumu.")Çıktı:
Yönetici girişi yapıldı.Örnek 4: Sınıf Desenleri
Özel bir sınıfın örneklerini eşleştirme. Önce sınıfı tanımlayalım:
class Nokta:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __repr__(self):
        return f"Nokta(x={self.x}, y={self.y})"
nokta_objesi = Nokta(10, 20)
mesaj_objesi = "Merhaba"
match nokta_objesi:
    case Nokta(x=0, y=0):
        print("Orijin noktasında.")
    case Nokta(x=nx, y=ny) if nx == ny:
        print(f"x ve y değerleri eşit: {nx}")
    case Nokta(x=nx, y=ny):
        print(f"Farklı bir nokta: x={nx}, y={ny}")
    case _:
        print("Bir Nokta objesi değil.")Çıktı:
Farklı bir nokta: x=10, y=20Örnek 5: OR Desenleri ve AS Desenleri
Birden fazla durumu tek bir case altında işleme ve değeri yakalama:
durum = "başarılı"
# durum = "tamamlandı"
# durum = "işlem_yapılmadı"
match durum:
    case "başarılı" | "tamamlandı" as sonuc:
        print(f"İşlem {sonuc} şekilde tamamlandı.")
    case "hata" | "başarısız":
        print("İşlemde bir hata oluştu.")
    case _:
        print("Bilinmeyen durum.")Çıktı:
İşlem başarılı şekilde tamamlandı.Önemli Notlar
Sıralama Önemlidir:
matchdeyimi,casebloklarını yukarıdan aşağıya doğru sırayla değerlendirir. İlk eşleşencasebloğu yürütülür vematchdeyiminden çıkılır. Bu nedenle, daha spesifik desenler genel desenlerden önce gelmelidir._(Wildcard): Alt çizgi (_), hiçbir şeyi yakalamayan ve her zaman eşleşen bir joker desendir. Genelliklematchbloğunun soncase'i olarak, varsayılan bir durumu ele almak için kullanılır (elsegibi).ifKoşulları (Guards): Bircasedeseni eşleşse bile, arkasından gelenifkoşuluFalseise ocasebloğu yürütülmez. Bu, daha karmaşık koşulları desen eşleştirmeye dahil etmek için güçlü bir yoldur.Değişken Yakalama: Bir desende kullanılan ve daha önce tanımlanmamış bir isim (örneğin
case x:), eşleşen değeri o değişkene atar. Bu, yakalama deseni olarak bilinir.Python 3.10 ve Sonrası:
matchdeyimi, Python'ın 3.10 sürümü ile birlikte tanıtılmıştır. Daha eski Python sürümlerinde bu özellik bulunmamaktadır.Performans: Küçük ve basit koşullar için
if/elif/elsezincirleri hala uygun olabilir. Ancak karmaşık veri yapıları üzerinde birden fazla durumu ele alırkenmatchdeyimi, kodu daha okunaklı ve sürdürülebilir hale getirir.
        
                
            
            
Yorum yap
Yorumlar