I'm having trouble with figuring out why the first of these assertions is OK and the second raises an error.
subject_list = [Subject("A"), Subject("B"), Subject("C")]
subject_set = set()
subject_set.add(Subject("A"))
subject_set.add(Subject("B"))
subject_set.add(Subject("C"))
self.assertIn(Subject("A"), subject_list)
self.assertIn(Subject("A"), subject_set)
Here is the error:
Traceback (most recent call last):
File "C:\Users\...\testSubject.py", line 34, in testIn
self.assertIn(Subject("A"), subject_set)
AssertionError: <Subject: A> not found in set([<Subject: B>, <Subject: C>, <Subject: A>])
The test for equality in the Subject class is simply self.name == other.name, and in another UnitTest I verify that Subject("A") == Subject("A") . I really can't figure out why the subject is in the list and not in the set. Ideally I'd like the subject to be in both.
The expression
Subject("A") in subject_list
will compare Subject("A") to each entry in subject_list using the Subject.__eq__() method. If this method is not overwritten, it defaults to always return False unless the two operands are the same object. The above expression would always return False if Subject lacked a __eq__() method, since Subject("A") is a new instance which cannot already be in the list.
The expression
Subject("A") in subject_set
on the contrary will use Subject.__hash__() first to find the right bucket, and use Subject.__eq__() only after this. If you did not define Subject.__hash__() in a way compatible with Subject.__eq__(), this will fail.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With