unorderable error: less ok, equal ok, less-or-equal gives unorderable error!
Peter Otten
__peter__ at web.de
Mon Jun 30 15:34:25 EDT 2014
RainyDay wrote:
> Hi, in python 3.4.1, I get this surpising behaviour:
>
>>>> l=Loc(0,0)
>>>> l2=Loc(1,1)
>>>> l>l2
> False
>>>> l<l2
> True
>>>> l<=l2
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> TypeError: unorderable types: Loc() <= Loc()
>>>> l==l2
> False
>>>> l<l2 or l==l2
> True
>
> Loc implements both __lt__ and __eq__, which should be enough (?),
These two methods should be sufficient if you use the
functools.total_ordering class decorator, see
https://docs.python.org/dev/library/functools.html#functools.total_ordering
> but even after I've added __lte__, I still have the error.
There is no special method of that name; it should probably be __le__().
>
> implementation:
>
> class Loc:
> def __init__(self, x, y):
> self._loc = x, y
> self.x, self.y = x, y
>
> def __eq__(self, other):
> return self._loc == getattr(other, "_loc", None)
Note that None is not a good default when _loc is expected to be a tuple:
>>> None < ()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: NoneType() < tuple()
>
> def __lt__(self, other):
> return self._loc < other._loc
>
> - andrei
More information about the Python-list
mailing list