تكرار السؤال: …
الإجابة المختصرة
عندما تعيد دالة واحدة أنواعًا مختلفة بحسب أنواع أو قيم معاملاتها؛ تكتب عدة توقيعات مزينة بـ overload للـ type checker، ثم implementation واحدة حقيقية بتوقيع عام.
الشرح
لا ينشئ overload أي dispatch وقت التشغيل؛ التوقيعات تُستخدم للفحص فقط وتُستبدل بالـ implementation الأخيرة. يجب أن تغطي الـ implementation كل الحالات الموصوفة، وأن تُرتب التوقيعات من الأكثر تحديدًا إلى الأعم. إذا كنت تحتاج dispatch فعليًا وقت التشغيل حسب النوع، فاستخدم functools.singledispatch.
مثال بالكود
from typing import Literal, overload
@overload
def load(path: str, as_text: Literal[True]) -> str: ...
@overload
def load(path: str, as_text: Literal[False]) -> bytes: ...
def load(path: str, as_text: bool) -> str | bytes:
with open(path, "rb") as f:
data = f.read()
return data.decode() if as_text else data
text = load("a.txt", True) # النوع: strأخطاء شائعة
- توقع أن overload يختار الدالة المناسبة وقت التشغيل.
- نسيان كتابة الـ implementation الفعلية بعد التوقيعات.