Comparing two objects (of the same type for simplicity) involves a three stage lookup: The class has the operator C.__eq__ It can be applied to operator (descriptor protocol): C().__eq__ and it produces a result: C().__eq__(C()) Exceptions can be raised in all 3 phases, but an exception in the first phase is not really an error, its just says the operation is not supported. E.g. class C: pass C() == C() is False, rather than raising an Exception. If an exception is raised in the 3rd stage, then it is propogated, as follows: class C: def __eq__(self, other): raise Exception("I'm incomparable") C() == C() raises an exception However, if an exception is raised in the second phase (descriptor) then it is silenced: def no_eq(self): raise Exception("I'm incomparable") class C: __eq__ = property(no_eq) C() == C() is False. But should it raise an exception? The behaviour for arithmetic is different. def no_add(self): raise Exception("I don't add up") class C: __add__ = property(no_add) C() + C() raises an exception. So what is the "correct" behaviour? It is my opinion that comparisons should behave like arithmetic and raise an exception. Cheers, Mark
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4