[Python-Dev] INPLACE_ADD and INPLACE_MULTIPLY oddities in ceval.c

Guido van Rossum guido at python.org
Tue Mar 28 03:21:18 CEST 2006


On 3/27/06, Travis Oliphant <oliphant.travis at ieee.org> wrote:
>
> If you have Numeric or numpy installed try this:
>
> #import Numeric as N
> import numpy as N
>
> a = range(10)
> b = N.arange(10)
>
> a.__iadd__(b)
>
> print a
>
> Result:
>
> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>
>
> Contrast the returned output with
>
> import numpy as N
>
> a = range(10)
> b = N.arange(10)
>
> a += b
>
> print a
>
> Result:
>
> [ 0  2  4  6  8 10 12 14 16 18]
>
>
> Having "a+=b" and "a.__iadd__(b)" do different things seems like an
> unfortunate bug.
>
> It seems to me that the problem is that the INPLACE_ADD and
> INPLACE_MULTIPLY cases in ceval.c  use PyNumber_InPlace<YYY> instead of
> trying PySequence_InPlace<YYY> when the object doesn't support the
> in-place number protocol.
>
> I could submit a patch if there is agreement that this is a problem.

Well how is the interpreter to know whether += meanse numeric add or
sequence add in any particular case?

Shouldn't it be numpy's responsibility to implement both operations identically?

(It's a design bug in Python that the + operation has two
implementation slots. But it's difficult to fix that until Python
3000. It *will* be fixed there.)

--
--Guido van Rossum (home page: http://www.python.org/~guido/)


More information about the Python-Dev mailing list