class foo(list): def __eq__(self, other): raise 'foo.__eq__ called' >>> help(list.__eq__) Help on wrapper_descriptor: __eq__(...) x.__eq__(y) <==> x==y >>> [].__eq__(foo()) True >>> [] == foo() Traceback (most recent call last): File "", line 1, in ? File " ", line 3, in __eq__ foo.__eq__ called
Help says those two statements should be equivalent. Why aren't they?
Comments
foo() == []
Jura gur glcr bs gur bowrpg ba gur evtug-unaq fvqr bs n pbzcnevfba vf n fhoglcr bs gur glcr bs gur bowrpg ba gur yrsg-unaq fvqr, vgf evpu-pbzcnevfba shapgvbaf ner hfrq vafgrnq bs gubfr sebz gur yrsg-unaq fvqr, jura ninvynoyr, naq ersyrpgrq (< orpbzrf >, rgp, ohg == fgnlf gur fnzr). Nf sne nf V xabj, vg'f whfg n fcrpvny pnfr, ohg vg qbrf fbeg bs znxr
frafr jura lbh guvax nobhg ubj lbh'q hfhnyyl hfr fhoglcrf va guvf jnl.
Gur bgure bcrengvba, jurer lbh'ir gnxra gur __rd__ nggevohgr bs [] qverpgyl anghenyyl unf n qvssrerag erfhyg, fvapr gur zrgubq pubfra vf abg hc gb gur evpu-pbzcnevfba znpuvarel.
class hat( object ):
def __eq__(self , other ):
print "I am hat"
print "other is a %s" % ( other.__class__.__name__ )
return True
class tree( object ):
def __eq__(self , other ):
print "I am tree"
print "other is a %s" % ( other.__class__.__name__ )
return False
a = hat()
b = tree()
a == b
b == a
it prints:
I am hat
other is a tree
I am tree
other is a hat
class hat( object ):
def __eq__(self , other ):
return NotImplemented
class tree( object ):
def __eq__(self , other ):
print "I am tree"
print "other is a %s" % ( other.__class__.__name__ )
return True
a = hat()
b = tree()
a == b
b == a
returns:
I am tree
other is a hat
I am tree
other is a hat
The NotImplemented forces it to try the other available __eq__()
...
Sorry. Had to.