Python, otuz yıldır dinamik tip dili olarak yaşadı; ama büyük projeler bu rahatlığın bedelini ödedi. Binlerce satırlık kod tabanlarında bir fonksiyona neyin geçtiğini kimse kesin bilemez hâle geldiğinde, topluluk bir çözüm aradı. Çözüm, dili değiştirmekten değil, dilin üzerine katman katman tip kültürü inşa etmekten geldi. Bugün Python, dinamikliğini korurken statik denetimi de ciddiye alan bir noktaya ulaşmış durumda.

Geç Tip Ek Açıklamaları: Sözleşmeyi Yazılı Hale Getirmek

Python'un tip sistemi, üçüncü parti araçların işidir. Dil, açıklamaları yalnızca sözdizimi olarak tanır; yorumlayıcı bunları çalışma anında uygulamaz. Uygulama işini mypy, pyright gibi denetleyiciler üstlenir. Yani bir hata yakalamak için önce denetleyiciyi çalıştırmak zorundasınız — bu, bazılarına zahmet görünür ama dilin felsefesine uygundur.

def iskonto_hesapla(tutar: float, oran: float) -> float:
    if oran > 0.5:
        raise ValueError("Oran çok yüksek")
    return tutar * (1 - oran)

toplam: float = iskonto_hesapla(1000.0, 0.2)

Denetleyici bu kodda tutarlılığı korur; ama kritik bir sınırlaması vardır: açıklamalar çalışma anında doğrulanmaz. Dosyadan okunan JSON, veritabanından gelen satır, kullanıcıdan gelen form — hepsi denetleyicinin göremediği sınır kapılarıdır. Tam da bu boşlukta Pydantic devreye girer.

Pydantic: Sınır Kapısında Doğrulama

Pydantic, tip açıklamalarını çalışma anında sınar. Bir model tanımlarsınız; dış dünyadan gelen veriyi bu modelin içinden geçirirsiniz. Veri uyuşmazsa açıklayıcı bir hata alırsınız; uyuşursa tip sistemi artık derleyicinin değil, çalışma anının garantisidir.

from pydantic import BaseModel

class Siparis(BaseModel):
    musteri_id: int
    tutar: float
    aciklama: str | None = None

siparis = Siparis.model_validate_json(
    '{"musteri_id": 42, "tutar": "199.90"}'
)
print(siparis.tutar)  # 199.90 — metinden float'a çevrildi

İkisi birlikte güzel bir işbölümü kurar: mypy iç mantığın tutarlılığını, Pydantic dış sınırların doğruluğunu sağlar. Modern çerçevelerin çoğu bu işbölümünü ilkelere geçirmiş durumda; FastAPI gibi araçlar istek gövdelerini doğrudan Pydantic modellerine bağlar. Aynı model sınıfından OpenAPI şeması da üretilir; dokümantasyon, doğrulama ve tip denetimi tek tanımdan beslenir. Bu, ekosistemde yeni bir standart hâline gelen üçlü yarardır.

Protokol ve Yapısal Tipleme

Python'un tip kültürünün en olgun yönü, yapısal tipleri anlatan protokollerdir. Somut bir sınıfı beklemek yerine "kapatılabilir", "dolaşılabilir", "boyutlu" davranışı bekleyebilirsiniz. Ördek tipleme ruhunu, çalışma anını yavaşlatmadan ve açık sözleşmeyle statik denetleyiciye okunur biçimde korur. Üçüncü parti kütüphanelerin ekosistemle kurduğu sözleşme artık imzada görünür; kütüphanenin kaynak kodunu okumak, bir arayüzün ne vaat ettiğini anlamak için zorunlu değildir. Bu yüzden topluluk artık "tip ekleyelim mi" tartışmasını değil, "nerede tip, nerede kural" sorusunu konuşuyor. Tartışmanın merkezinin yer değiştirmesi, dönüşümün tamamlandığının en güçlü kanıtıdır.

Dönüşümün Bedeli ve Ödülü

Bu dönüşümü tamamen sorunsuz ilerlediği söylenemez. Tip açıklamaları tekrara yol açar; üçüncü parti kütüphanelerin ek açıklama kalitesi eşit değildir; ekosistemin bazı köşeleri hâlâ denetleyiciyi atlatır. Ama aynı hareket, Python'u büyük ölçekte yeniden savunulabilir kıldı. Eski tartışma "statik mi dinamik mi"ydi; bugün tartışma, iki yaklaşımın hangi sınırlarda birleşeceğidir.

Python'un tip dönüşümü, bir dilin kültürünün nasıl değiştiğinin canlı bir kaydı. Dil kurallarını sertleştirmedi; geliştiricilere, istediklerinde kesinliğe yaklaşabilecekleri bir merdiven koydu. Merdiveni kullanmak mecburi değil — ama büyük projelerde artık merdiveni kullanmamanın bedeli, herkesin gördüğü bir fiyata düştü.