[Python-Dev] Deprecated __cmp__ and total ordering

Mart Sõmermaa mrts.pydev at gmail.com
Tue Mar 10 13:00:32 CET 2009

__cmp__ used to provide a convenient way to make all ordering operators work
by defining a single method. For better or worse, it's gone in 3.0.

To provide total ordering without __cmp__ one has to implement all of
__lt__, __gt__, __le__, __ge__, __eq__ and __ne__. However, in all but a few
cases it suffices only to provide a "real" implementation for e.g. __lt__
and define all the other methods in terms of it as follows:

class TotalOrderMixin(object):
    def __lt__(self, other):
        raise NotImplemented # override this

    def __gt__(self, other):
        return other < self

    def __le__(self, other):
        return not (other < self)

    def __ge__(self, other):
        return not (self < other)

__eq__ and __ne__ are somewhat special, although it is possible to define
them in terms of __lt__

    def __eq__(self, other):
        return not (self == other)

    def __ne__(self, other):
        return self < other or other < self

it may be inefficient.

So, to avoid the situation where all the projects that match
http://www.google.com/codesearch?q=__cmp__+lang%3Apython have to implement
their own TotalOrderMixin, perhaps one could be provided in the stdlib? Or
even better, shouldn't a class grow automagic __gt__, __le__, __ge__ if
__lt__ is provided, and, in a similar vein, __ne__ if __eq__ is provided?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20090310/d0ee96dd/attachment.htm>

More information about the Python-Dev mailing list