Desen eşleşme mekanizması Python 3.10'da Yapısal Desen Eşleşmesi adıyla ortaya çıktı ve match-case yapısıyla gerçekleştirilmiştir. Bu araç, karmaşık veri yapılarını şablonlarla eşleştirerek şık ve özlü bir şekilde analiz etmeyi sağlar.
Birçok fonksiyonel dilde (örneğin, Haskell, Scala) desen eşleşme uzun zamandır veri yapısına göre mantık dalı oluşturmanın pratik bir yolu olarak kabul edilir. Python uzun bir süre bu mekanizmaya sahip olmadan, if-elif-else zincirleri veya açma işlemleriyle yetinmek zorunda kaldı.
Karmaşık iç içe geçmiş veri yapıları (sözlükler, listeler, nesneler) genellikle türler, değerler ve yapı üzerinde çok sayıda kontrol gerektirir; bu da birçok koşul içeren karmaşık bir koda yol açar.
match-case, koşul yığılmasını önleyerek tür ve yapı dikkate alınarak veri işleme senaryolarını açıklamanın deklaratif ve okunabilir bir yolunu sunar.
def process(event): match event: case {"type": "click", "x": x, "y": y}: return f"Click at ({x}, {y})" case [command, *args]: return f"Command: {command}, args: {args}" case _: return "Unknown event" print(process({"type": "click", "x": 2, "y": 5})) # Click at (2, 5) print(process(["RUN", 1, 2, 3])) # Command: RUN, args: [1, 2, 3]
match-case sadece değere göre mi eşleştirir? Hayır. Eşleşme yapı, tür, koleksiyon açma ve hatta nesne özellikleri üzerinden (özel yöntemler match_args belirlenirse) gerçekleşebilir.
match'teki case sırası etkiler mi? Evet. Analiz yukarıdan aşağıya doğru ilerler, ilk uygun şablon çalışır. Sonraki case'ler kontrol edilmez.
Kullanıcı tanımlı sınıflar ile eşleştirme yapmak mümkün mü? Evet, eğer sınıf match_args ve/veya getitem yöntemlerini uyguluyorsa. O zaman desen eşleşme alan değerlerini çıkarabilir.
class Point: __match_args__ = ("x", "y") def __init__(self, x, y): self.x = x self.y = y def where(obj): match obj: case Point(x, y): return f"Point at {x}, {y}" case _: return "Unknown" print(where(Point(1, 2))) # Point at 1, 2
Artıları:
Olumsuz Durum: Geliştiriciler, basit boolean dallanmalarda bile match-case kullandılar, bu da yalnızca kodu karmaşıklaştırdı. Artılar: yeni bir özelliği öğrendiler. Eksiler: okunabilirlik kayboldu ve hata sayısı arttı.
Olumlu Durum: Birçok olay ve iç içe geçmiş yapı barındıran bir uygulamada (örneğin grafik ayrıştırıcı) match-case, karmaşık if-elif yapılarından kaçınmayı sağladı ve ayrıştırmayı merkezileştirdi. Artılar: okunabilirlik arttı, hata sayısı azaldı. Eksiler: yeni yapı üzerinde takımın eğitim alması gerekti.