Confusing problem (well, for me anyway)

Steven Taschuk staschuk at telusplanet.net
Sat Feb 22 21:54:51 CET 2003


Quoth Duncan Smith:
  [...]
>     def __cmp__(self, other):
  [...]
>             if comp == size:
>                 print 'returning 1'
>                 return 1
>             else:
>                 print 'returning 0'
>                 return 0
  [...]
> >>> t == t1
> 6 6 1
> returning 1
> 0
  [...]
> I cannot see why the function returns 1 when it should return 0 (and
> vice-versa).  How can it print 'returning 1' and then return 0?

__cmp__ doesn't implement equality testing, or rather, not *just*
equality testing.  It actually compares two objects for order:
    >>> cmp(1,2)
    -1
    >>> cmp(1,1)
    0
    >>> cmp(2,1)
    1
(The built-in cmp() uses __cmp__ for objects which define it.)

Returning 1 from __cmp__ means "I'm greater than that other
object", returning 0 means "I'm equal to that other object", and
returning -1 means "I'm less than that other object".

Thus, asking
	x == y
is the same as asking
	cmp(x, y) == 0
whence the weirdness you see: __cmp__ returns 1, which means >,
therefore !=, and so == yields 0.

If you just want equality testing, not order testing, provide
__eq__ and __ne__ instead.

-- 
Steven Taschuk                                                   w_w
staschuk at telusplanet.net                                      ,-= U
                                                               1 1





More information about the Python-list mailing list