تكرار السؤال: …
الإجابة المختصرة
يشير Final إلى اسم لا يجب إعادة إسناده (وفق أدوات الفحص)، و Literal يحصر القيمة في مجموعة ثابتة من القيم الحرفية مثل "asc" أو "desc".
الشرح
يوثق Final الثوابت وإعدادات الموديول، ويمنع checker إعادة تعريفها أو تجاوزها في subclass. ويناسب Literal الخيارات المغلقة الصغيرة، ويمكن الجمع بينه وبين overload لتغيير نوع الإرجاع حسب القيمة. للخيارات الأكبر أو التي لها سلوك، يكون Enum أوضح. كلاهما لا يفرض شيئًا وقت التشغيل، لذلك يجب التحقق من المدخلات الخارجية قبل الوثوق بها.
مثال بالكود
from typing import Final, Literal
MAX_RETRIES: Final = 3
SortOrder = Literal["asc", "desc"]
def list_users(order: SortOrder = "asc") -> list[str]:
...
list_users("random") # mypy: incompatible type
MAX_RETRIES = 5 # mypy: Cannot assign to final nameأخطاء شائعة
- استخدام str عام لخيارات مغلقة مما يسمح بقيم خاطئة بصمت.
- افتراض أن Final تمنع التعديل وقت التشغيل.