المستوى: مبتدئ
اكتب Type Hints في Python ومش هتشوف TypeError مرة تانية في الإنتاج. سطر واحد فوق كل دالة بيخلّي الـ IDE والـ mypy يقولّك على الـ bug قبل ما تضغط Run.
Type Hints في Python: المفهوم اللي بيوفّر 80% من Debugging Time
المشكلة باختصار
Python لغة dynamic typing. المتغير الواحد ممكن يكون int النهارده و str بكره و list بعده، والـ interpreter مش هيعترض. ده مرن لكنه بيخلّي حوالي 30% من bugs الإنتاج سببها قيمة بنوع غلط مرّت من دالة لدالة لحد ما حصل crash جوّه deep stack مفيش حد فاهمه.
Type Hints بتقفل الباب ده static-time قبل ما الكود يتشغّل. الـ interpreter بيتجاهلها runtime، لكن أدوات زي mypy و pyright بتمسك الخطأ وانت بتكتب.
المفهوم بمثال بسيط
تخيّل موظف استقبال في فندق. لو الزبون قاله "أنا حجزت غرفة"، الموظف بيسأله عن اسم الحجز ورقم البطاقة. لو الزبون مدّ له ورقة كتب عليها "كرسي" بدل اسم، الموظف هيرفض في ثانية. الموظف عنده قائمة بالأنواع المقبولة لكل مدخل.
Python بدون Type Hints هو موظف الاستقبال اللي بيستلم أي حاجة بدون مراجعة، وبيكتشف إن الورقة فيها كلمة "كرسي" بعد ما يكون عمل 5 خطوات تانية اعتماداً عليها. Type Hints بتديله القائمة من الأول.
التعريف العلمي
طبقاً لـ PEP 484 (Sept 2014، اللي اعتُمد في Python 3.5)، Type Hints هي annotations بتتكتب على الـ function parameters والـ return type لتوضيح النوع المتوقع. الـ Python interpreter بيتجاهلها كلياً وقت التشغيل (مفيش overhead)، لكن type checkers زي mypy و pyright و Pyre بتقرأها وبتعمل static analysis قبل التشغيل لاكتشاف عدم التوافق.
الكود قبل وبعد
قبل Type Hints
def calculate_discount(price, discount_percent):
return price - (price * discount_percent / 100)
# طلب جاي من JSON API، السعر اتحوّل string من غير ما تحس
result = calculate_discount("499.99", 15)
print(result)
# TypeError: unsupported operand type(s) for -: 'str' and 'float'
# هتكتشف الخطأ ده في الإنتاج مع 200 user قاعدين يحاولوا يدفعوا
بعد Type Hints
def calculate_discount(price: float, discount_percent: float) -> float:
return price - (price * discount_percent / 100)
result = calculate_discount("499.99", 15)
# mypy بيطلع الخطأ ده فوراً وانت لسه بتكتب:
# Argument 1 to "calculate_discount" has incompatible type "str"; expected "float"