تكرار السؤال: …
الإجابة المختصرة
يولّد تلقائيًا __init__ و __repr__ و __eq__ (واختياريًا ترتيبًا و hash وتجميدًا) بناءً على الحقول المعلنة بـ type annotations.
الشرح
تقلل dataclass الكود المتكرر لكائنات البيانات. أهم الخيارات: frozen=True لمنع التعديل وجعل الكائن hashable، و slots=True لتقليل الذاكرة، و kw_only=True لإجبار التمرير بالاسم، و order=True لتوليد عمليات المقارنة. استخدم field(default_factory=list) للقيم الافتراضية القابلة للتغيير، ويمكن وضع التحقق في __post_init__. لاحظ أن dataclass لا تتحقق من الأنواع وقت التشغيل.
مثال بالكود
from dataclasses import dataclass, field
@dataclass(frozen=True, slots=True)
class Order:
id: int
items: tuple[str, ...] = ()
@dataclass
class Cart:
lines: list[str] = field(default_factory=list)
def __post_init__(self):
if len(self.lines) > 100:
raise ValueError("too many lines")أخطاء شائعة
- كتابة lines: list = [] مباشرة، وهو ما ترفضه dataclass بخطأ ValueError.
- افتراض أن dataclass تتحقق من الأنواع وقت التشغيل مثل Pydantic.