تكرار السؤال: …
الإجابة المختصرة
يمثل TypeVar نوعًا مجهولًا يجب أن يبقى ثابتًا عبر أجزاء التوقيع، و Generic يسمح بتعريف class تحافظ على نوع ما تحتويه؛ ومنذ Python 3.12 توجد صيغة مختصرة def first[T](...) و class Box[T].
الشرح
الهدف أن يفهم الـ type checker العلاقة بين المدخل والمخرج: دالة تعيد أول عنصر من list[int] يجب أن تعيد int لا Any. يمكن تقييد TypeVar بحد أعلى (bound) أو بقائمة أنواع مسموحة. ابدأ بتوقيعات بسيطة، وأضف generics عندما يوجد عقد قابل لإعادة الاستخدام فعلًا مثل Repository أو Cache.
مثال بالكود
# Python 3.12+
def first[T](items: list[T]) -> T:
return items[0]
class Repository[T]:
def __init__(self) -> None:
self._items: dict[int, T] = {}
def get(self, key: int) -> T | None:
return self._items.get(key)
n = first([1, 2]) # النوع المستنتج: intأخطاء شائعة
- إعادة Any من دوال عامة مما يلغي فائدة الفحص لدى المستدعي.
- استخدام TypeVar يظهر مرة واحدة فقط في التوقيع فلا يربط شيئًا.