The following piece of code
class point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def dispc(self):
        return ('(' + str(self.x) + ',' + str(self.y) + ')')
    def __cmp__(self, other):
        return ((self.x > other.x) and (self.y > other.y))
works fine in Python 2, but in Python 3 I get an error:
>>> p=point(2,3)
>>> q=point(3,4)
>>> p>q
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: point() > point()
It only works for == and !=.
                        
You need to provide the rich comparison methods for ordering in Python 3, which are
__lt__,__gt__,__le__,__ge__,__eq__, and__ne__. See also: PEP 207 -- Rich Comparisons.__cmp__is no longer used.More specifically,
__lt__takesselfandotheras arguments, and needs to return whetherselfis less thanother. For example:(This isn't a sensible comparison implementation, but it's hard to tell what you were going for.)
So if you have the following situation:
This will be equivalent to:
which would return
True.__eq__would returnTrueif the points are equal andFalseotherwise. The other methods work analogously.If you use the
functools.total_orderingdecorator, you only need to implement e.g. the__lt__and__eq__methods: