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