Velocity Reviews > Problem comparing object graphs and trees

# Problem comparing object graphs and trees

raphael.marvie@gmail.com
Guest
Posts: n/a

 12-15-2006

Dear all,

I am trying to compare graphes of object through the use of the __cmp__
operator. Before managing the problem of recursive comparison, I have
tried a simple test which result surprises me. Here is the simplest
code I can write that presents my problem:

</pre>
\$ cat cmp.py

class A:
def __init__(self, b):
self.b = b
def __cmp__(self, other):
return self.b == other.b

class B:
pass

if __name__ == '__main__':
b = B()
a1 = A(b)
a2 = A(b)
print a1 == a2
print a1 == a1

\$ python cmp.py
False
False
</pre>

I swear I am not drunk, but why isn't a1 == a2 and worse why isn't a1
== a1? Does someone have a clue and can explain to me this suprising
behavior? (python 2.4.3 on Ubuntu 6.06).

Cheers,

r.

Peter Otten
Guest
Posts: n/a

 12-15-2006
http://www.velocityreviews.com/forums/(E-Mail Removed) wrote:

> </pre>
> \$ cat cmp.py
>
> class A:
> def __init__(self, b):
> self.b = b
> def __cmp__(self, other):
> return self.b == other.b
>
> class B:
> pass
>
> if __name__ == '__main__':
> b = B()
> a1 = A(b)
> a2 = A(b)
> print a1 == a2
> print a1 == a1
>
> \$ python cmp.py
> False
> False
> </pre>
>
> I swear I am not drunk, but why isn't a1 == a2 and worse why isn't a1
> == a1? Does someone have a clue and can explain to me this suprising
> behavior? (python 2.4.3 on Ubuntu 6.06).

__cmp__() must return 0 for equal objects:

>>> 1 .__cmp__(0), 1 .__cmp__(1), 1 .__cmp__(2)

(1, 0, -1)

You might have a look at rich comparison before you proceed:

>>> class A(object):

.... def __init__(self, b):
.... self.b = b
.... def __eq__(self, other):
.... return self.b == other.b
....
>>> A(1) == A(1)

True
>>> A(1) == A(42)

False

Peter

raphael.marvie@gmail.com
Guest
Posts: n/a

 12-15-2006

I am not drunk but should have rtfm.

Sorry and Thanks.

r.

On Dec 15, 3:04 pm, Peter Otten <(E-Mail Removed)> wrote:
> (E-Mail Removed) wrote:
> > </pre>
> > \$ cat cmp.py

>
> > class A:
> > def __init__(self, b):
> > self.b = b
> > def __cmp__(self, other):
> > return self.b == other.b

>
> > class B:
> > pass

>
> > if __name__ == '__main__':
> > b = B()
> > a1 = A(b)
> > a2 = A(b)
> > print a1 == a2
> > print a1 == a1

>
> > \$ python cmp.py
> > False
> > False
> > </pre>

>
> > I swear I am not drunk, but why isn't a1 == a2 and worse why isn't a1
> > == a1? Does someone have a clue and can explain to me this suprising
> > behavior? (python 2.4.3 on Ubuntu 6.06).__cmp__() must return 0 for equal objects:

>
> >>> 1 .__cmp__(0), 1 .__cmp__(1), 1 .__cmp__(2)(1, 0, -1)

>
> You might have a look at rich comparison before you proceed:
>
> >>> class A(object):... def __init__(self, b):

> ... self.b = b
> ... def __eq__(self, other):
> ... return self.b == other.b
> ...>>> A(1) == A(1)
> True
> >>> A(1) == A(42)False

>
> Peter

Duncan Booth
Guest
Posts: n/a

 12-15-2006
(E-Mail Removed) wrote:

> I swear I am not drunk, but why isn't a1 == a2 and worse why isn't a1
>== a1? Does someone have a clue and can explain to me this suprising
> behavior? (python 2.4.3 on Ubuntu 6.06).

Because the __cmp__ method doesn't return a boolean. It returns a value <0,
0 or >0 according to the relative ordering of its arguments. You are
returning True (1) when the values are equal and you should be returning 0.

If ordering isn't defined for your objects then define __eq__ instead of
__cmp__.