assymetry between a == b and a.__eq__(b)
Nick Coghlan
ncoghlan at email.com
Sat Dec 4 20:19:09 EST 2004
Peter Otten wrote:
> Tim Peters wrote:
>
>
>>See the Python (language, not library) reference manual, section 3.3.8
>>("Coercion rules"), bullet point starting with:
>>
>> Exception to the previous item: if the left operand is an
>> instance of a built-in type or a new-style class, and the right
>> operand is an instance of a proper subclass of that type or
>> class, ...
>
>
> So that is settled then. Not the most likely place to investigate when one
> has just read that "Arguments to rich comparison methods are never coerced"
> in 3.3.1 ("Basic customization"), though.
<Heh - just reread this, and realised my reply below misses the point. You're
right that the subsection heading is a little misleading. . .>
Nothing is getting coerced. It's just that "A binop B" gets translated to a
method call differently depending on the types of A and B. The options being:
A.__binop__(B) # 1 - the usual case
B.__binop__(A) # 2.1 - commutative op, and B is a proper subclass of A
B.__rbinop__(A) # 2.2 - possibly non-commutative op, and B is a proper subclass of A
This is so that things like the following work:
.>>> class SillyAdd(long):
.... __add__ = long.__mul__
.... __radd__ = __add__
....
.>>> a = SillyAdd(4)
.>>> a
.4L
.>>> a + 5
.20L
.>>> 5 + a
.20L
Cheers,
Nick.
More information about the Python-list
mailing list