تقنية

Iterable في بايثون: لماذا ينجح الاجتياز رغم نتيجة False؟

فحص Iterable سلبي رغم نجاح list
الصف الأول مختصر لـisinstance. [1] [2]

اختبار الفئة ليس تجربة اجتياز. [1] [2]

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

قد يعطي فحص abc.Iterable نتيجة False لكائن ينجح اجتيازه عبر __getitem__. [1] [2]

  • نعرف فئة دون __iter__ أو تسجيل لدى Iterable. [1] [2]
  • الفهرسان 0 و1 يعيدان 4 و5. [1] [2]
  • عند 2 ترفع دالتنا IndexError. [1] [2]
  • فحص الفئة يعطي False، بينما list(c) يعطي [4, 5]. [1] [2]
  • اختبرنا 3.12.14؛ نجاح هذا المثال المحدود لا يضمن نجاح اجتياز كل كائن. [1] [2]

المثال

from collections import abc
class C:
 def __getitem__(self,i):
  if i>=2:raise IndexError
  return i+4
c=C()
print(isinstance(c,abc.Iterable))
print(list(c))

[1] [2]

المخرجات: False ثم [4, 5]. [1] [2]

لماذا يختلف الفحصان؟

يتعرف فحص Iterable على التسجيل أو __iter__، ولا يلتقط الفئات التي تجتاز باستخدام __getitem__ وحدها. يفحص خطاف الفئة المثبت __iter__. [1] [2]

في الاجتياز تنتج فئتنا القيمتين؛ لم نسجلها. [1] [2]

دالتنا تعيد قيمتين ثم ترفع IndexError
فهرسة دالتنا المعلنة. [1] [2]

حدود النتيجة

دالتنا تحدد القيم والنهاية؛ لا نعمم نجاحها على كل تعريف لـ__getitem__. [1] [2]

المراجع

  1. Python: collections.abc وIterable
  2. CPython 3.12.14: _collections_abc.py
  3. موضوع تك: لغة بايثون — مفردات
  4. موضوع تك: تطبيقات بايثون — مفردات

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