الدرس 3 من 10

متى يتساوى كائنان

هدف الدرس

مفتاح في قاموس وعنصر في مجموعة

01

الشرح

إذا لم تعرّف المساواة بنفسك فإن == بين كائنين تسأل «هل هما الكائن نفسه؟» ولا تسأل «هل يحملان القيم نفسها؟»، ولهذا تعطي Point(1, 2) == Point(1, 2) القيمة False، وتمتلئ مجموعة النقاط التي زرتها بالنقاط المكرّرة.

والدالة __eq__ تعرّف المساواة بالقيم، وإذا كان الطرف الآخر من نوع لا تعرفه فأرجِع NotImplemented وليس False، لتعطي Python الطرف الآخر فرصته في المقارنة قبل أن تحكم.

والفخّ الشائع أن تعريف __eq__ وحدها يُلغي __hash__، فلا يعود الكائن يصلح عنصرًا في مجموعة ولا مفتاحًا في قاموس، وترى الخطأ TypeError: unhashable type. والقاعدة أن الكائنين المتساويين يجب أن يكون لهما hash واحد، فاحسبه من الحقول نفسها التي تقارن بها، ولا تغيّر هذه الحقول بعد أن يدخل الكائن مجموعة، وإلا ضاع فيها.

02

المطلوب

أضف إلى Point دالة __eq__ تقارن x وy وتُرجع NotImplemented إذا لم يكن الطرف الآخر نقطة، ودالة __hash__ تتّفق معها.

الفحوص

6 فحوص
  1. نقطتان بالإحداثيات نفسها متساويتان
  2. النقطتان المختلفتان غير متساويتين
  3. المقارنة بنوع آخر تعطي False دون خطأ
  4. المتساويتان لهما hash واحد
  5. النقطة تصلح مفتاحًا في قاموس
  6. المجموعة تحذف النقاط المكرّرة
main.py
المخرجاتPython (Pyodide)

نحمّل بيئة Python الآن. يحدث هذا مرّة واحدة فقط، ثم يحفظها متصفّحك.

–/6

يبدأ الفحص حين تجهز البيئة.

تجد 6 فحوص في بطاقة «المطلوب».