تقنية

__bool__ في بايثون: هل تقبل العدد 1 وتستعين بـ__len__ عند الخطأ؟

Bad; __bool__: int1; __len__:3; bool(Bad()): TypeError.
النوع الخاطئ يفشل.

__bool__ تحتاج True أو False؛ __len__ بديل عند غيابها، لا عند إرجاع نوع خاطئ. [1] [2]

الخلاصة السريعة

لا؛ العدد يسبب خطأ في مثالنا. [1] [2]

  • __bool__ تحتاج True أو False؛ __len__ بديل عند غيابها، لا عند إرجاع نوع خاطئ. [1] [2]
  • على CPython 3.12.14، Bad تعرف الطريقتين؛ __bool__ تعيد 1، و__len__ تعيد 3. نسجل الاستدعاءات. [1] [2]
  • bool(Bad()) ترفع TypeError؛ calls تصبح ["bool"]. [1] [2]
  • وجود __len__ لم ينقذ النداء؛ calls لا تحمل "len". [1] [2]
  • تحكم: LengthOnly تعرف __len__ فقط، وتعيد 3؛ bool(LengthOnly()) تعطي True وcontrol_calls تصبح ["len"]. نختبر الفئتين المؤلفتين. [1] [2]

النوع المطلوب

__bool__ تحتاج True أو False؛ __len__ بديل عند غيابها، لا عند إرجاع نوع خاطئ. [1] [2]

طريقة موجودة بنتيجة خاطئة

على CPython 3.12.14، Bad تعرف الطريقتين؛ __bool__ تعيد 1، و__len__ تعيد 3. نسجل الاستدعاءات. [1] [2]

الخطأ والاستدعاء

bool(Bad()) ترفع TypeError؛ calls تصبح ["bool"]. [1] [2]

calls=[] class Bad: def __bool__(self):calls.append("bool");return 1 def __len__(self):calls.append("len");return 3 try:bool(Bad()) except TypeError:print("TypeError",calls) [1] [2]

LengthOnly; no __bool__; __len__:3; bool(LengthOnly()): True.
غياب الطريقة يسمح بالبديل.

البديل عند الغياب

وجود __len__ لم ينقذ النداء؛ calls لا تحمل "len". [1] [2]

control_calls=[] class LengthOnly: def __len__(self):control_calls.append("len");return 3 print(bool(LengthOnly()),control_calls) [1] [2]

تحكم: LengthOnly تعرف __len__ فقط، وتعيد 3؛ bool(LengthOnly()) تعطي True وcontrol_calls تصبح ["len"]. نختبر الفئتين المؤلفتين. [1] [2]

المراجع

  1. Python __bool__
  2. CPython 3.12.14 bool slot

للتوسع: لغات البرمجة.

أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.