تقنية

assertIs في بايثون: هل تستدعي __eq__ المخصصة؟

Box instances; assertIs(first,second); AssertionError; eq calls: 0.
المختلف يفشل.

assertIs تفحص هل الطرفان الكائن نفسه؛ نجاح المساواة المخصصة ليس شرط مرورها. [1] [2]

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

لا؛ لم تستدعها في مثالنا. [1] [2]

  • assertIs تفحص هل الطرفان الكائن نفسه؛ نجاح المساواة المخصصة ليس شرط مرورها. [1] [2]
  • على CPython 3.12.14، first وsecond كائنان منفصلان من Box؛ __eq__ تسجل "eq" في calls وتعيد True. [1] [2]
  • assertIs(first,second) تفشل بـAssertionError؛ calls تبقى []. [1] [2]
  • تحكم: assertIs(first,first) تمر؛ calls ما زالت []. [1] [2]
  • بعد ذلك first==second تعطي True؛ calls تصبح ["eq"]. النتيجة تميز استدعاء المساواة عن اختبار الهوية في هذه الفئة المؤلفة. [1] [2]

شرط الهوية

assertIs تفحص هل الطرفان الكائن نفسه؛ نجاح المساواة المخصصة ليس شرط مرورها. [1] [2]

مساواة مخصصة

على CPython 3.12.14، first وsecond كائنان منفصلان من Box؛ __eq__ تسجل "eq" في calls وتعيد True. [1] [2]

كائنان منفصلان

assertIs(first,second) تفشل بـAssertionError؛ calls تبقى []. [1] [2]

from unittest import TestCase tc=TestCase();calls=[] class Box: def __eq__(self,other):calls.append("eq");return True first=Box();second=Box() try:tc.assertIs(first,second) except AssertionError:print("AssertionError",calls) [1] [2]

Same Box instance; assertIs(first,first); pass; eq calls: 0.
نفسه يمر.

الكائن نفسه والمقارنة

تحكم: assertIs(first,first) تمر؛ calls ما زالت []. [1] [2]

tc.assertIs(first,first) print("pass",calls) print(first==second,calls) [1] [2]

بعد ذلك first==second تعطي True؛ calls تصبح ["eq"]. النتيجة تميز استدعاء المساواة عن اختبار الهوية في هذه الفئة المؤلفة. [1] [2]

المراجع

  1. Python assertIs
  2. CPython 3.12.14 assertion

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

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