Confusing problem (well, for me anyway)
Steven Taschuk
staschuk at telusplanet.net
Sat Feb 22 15:54:51 EST 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