Python NotImplemented constant
NotImplemented
allows you to indicate that a comparison between the two given operands has not been implemented (rather than indicating that the comparison is valid, but yields False
, for the two operands).
From the Python Language Reference:
For objects x and y, first
x.__op__(y)
is tried. If this is not implemented or returns NotImplemented,y.__rop__(x)
is tried. If this is also not implemented or returns NotImplemented, a TypeError exception is raised. But see the following exception:
Exception to the previous item: if the left operand is an instance of a built-in type or a new-style class, and the right operand is an instance of a proper subclass of that type or class and overrides the base's
__rop__()
method, the right operand's__rop__()
method is tried before the left operand's__op__()
method. This is done so that a subclass can completely override binary operators. Otherwise, the left operand's__op__()
method would always accept the right operand: when an instance of a given class is expected, an instance of a subclass of that class is always acceptable.
It actually has the same meaning when returned from __add__
as from __lt__
, the difference is Python 2.x is trying other ways of comparing the objects before giving up. Python 3.x does raise a TypeError. In fact, Python can try other things for __add__
as well, look at __radd__
and (though I'm fuzzy on it) __coerce__
.
# 2.6
>>> class A(object):
... def __lt__(self, other):
... return NotImplemented
>>> A() < A()
True
# 3.1
>>> class A(object):
... def __lt__(self, other):
... return NotImplemented
>>> A() < A()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: A() < A()
See Ordering Comparisions (3.0 docs) for more info.