dataclass nedir? Normal sınıf, NamedTuple ve Pydantic ile farkı nedir?
Cevap
@dataclass (Python 3.7+), tip ipuçlarından yola çıkarak __init__, __repr__ ve __eq__ metodlarını otomatik üretir. Veri taşıyan sınıflardaki tekrar eden kodu ortadan kaldırır.
from dataclasses import dataclass, field
@dataclass(frozen=True, slots=True)
class Siparis:
id: int
musteri: str
urunler: list[str] = field(default_factory=list)
toplam: float = 0.0
s = Siparis(1, "Ayşe")
print(s) # Siparis(id=1, musteri='Ayşe', urunler=[], toplam=0.0)frozen=True: alanlar değiştirilemez, nesne hash'lenebilir olur.slots=True(3.10+):__slots__üretir, bellek tasarrufu sağlar.- Mutable varsayılan için
field(default_factory=list)zorunludur;= []yazmak hata verir. __post_init__ile ek doğrulama yapılabilir.
Karşılaştırma
| dataclass | NamedTuple | Pydantic BaseModel | |
|---|---|---|---|
| Değiştirilebilir | Evet (frozen değilse) | Hayır | Evet |
| Çalışma zamanı tip doğrulaması | Yok | Yok | Var |
| Tip dönüşümü ("5" -> 5) | Yok | Yok | Var |
| Tipik kullanım | İç domain nesneleri | Hafif, tuple uyumlu kayıtlar | API girdisi, config, JSON |
Önemli nokta: Python tip ipuçları çalışma zamanında zorlanmaz. Siparis(id="abc", ...) dataclass'ta hata vermez. Dış dünyadan gelen veriyi (HTTP isteği, env değişkeni) doğrulamak gerekiyorsa Pydantic gibi bir kütüphane tercih edilir; FastAPI bu yüzden Pydantic kullanır.
İlgili Python soruları
- list ve tuple arasındaki fark nedir?
- Varsayılan argüman olarak liste vermek neden tehlikelidir?
- Decorator nedir? Basit bir zamanlama decorator'ı yazın.
- Generator nedir, yield ne yapar?
- GIL nedir ve çoklu iş parçacığını nasıl etkiler?
- async/await ve asyncio nasıl çalışır? Ne zaman thread veya process yerine tercih edilir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.