custom sorting and __cmp__

Lee Harr missive at frontiernet.net
Sun Nov 30 17:13:15 CET 2003


Let's say I have a class

class A:
    def __init__(self, level):
        self.level = level

and I want to put some of these in a list and sort the list
by level

a1 = A(1)
a2 = A(2)
l = [a1, a2]
l.sort()

Am I better off creating a __cmp__ method for my class or
making a cmp function to pass to sort?


My thought was that __cmp__ would be perfect, but then I 
started thinking about this ...

>>> class A:
...   def __init__(self, level):
...     self.level = level
...   def __cmp__(self, other):
...     if self.level > other.level:
...       return 1
...     elif self.level < other.level:
...       return -1
...     else:
...       return 0
...
>>> a1 = A(1)
>>> a2 = A(2)
>>> class C:
...   pass
...
>>> c = C()
>>> a1 == a2
False
>>> a1 < a2
True
>>> a1 == c
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "<stdin>", line 5, in __cmp__
AttributeError: C instance has no attribute 'level'


Should I be catching comparisons to objects that do not have
my 'level' attribute and falling back to id comparison?
Or am I worried about nothing (YAGNI :o) ?


Is this related in any way to interfaces?





More information about the Python-list mailing list