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

dataclassNamedTuplePydantic BaseModel
DeğiştirilebilirEvet (frozen değilse)HayırEvet
Çalışma zamanı tip doğrulamasıYokYokVar
Tip dönüşümü ("5" -> 5)YokYokVar
Tipik kullanımİç domain nesneleriHafif, tuple uyumlu kayıtlarAPI 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.

  1. list ve tuple arasındaki fark nedir?KolayPythonBackend
  2. Varsayılan argüman olarak liste vermek neden tehlikelidir?OrtaPythonBackend
  3. Decorator nedir? Basit bir zamanlama decorator'ı yazın.OrtaPythonBackend
  4. Generator nedir, yield ne yapar?OrtaPythonBackend
  5. GIL nedir ve çoklu iş parçacığını nasıl etkiler?ZorPythonBackend
  6. async/await ve asyncio nasıl çalışır? Ne zaman thread veya process yerine tercih edilir?ZorPythonBackend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle