Roy Smith wrote:
In article <4b0a01a...@dnews.tpgi.com.au>, Lie Ryan <lie.1...@gmail.com> wrote:

The semantic of the in-place operator is something like:
x += y
becomes
x = x.__iadd__(y)

Except that the expression x is evaluated just once instead of twice.

thus
foo.bar += baz
becomes
foo.bar = foo.bar.__iadd__(baz)

So the call sequence is,
foo.__getattr__('bar') ==> x
x.__iadd__(baz) ==> y
foo.__setattr__('bar', y)

I don't get where the __setattr__() call comes from in this situation.

Augmented *ASSIGNMENT* is a type of assignment.

The dis module can be used to see what CPython does.
>>> from dis import dis
>>> def f():
         foo.bar += baz

>>> dis(f)
  2           0 LOAD_GLOBAL              0 (foo)
              3 DUP_TOP
              4 LOAD_ATTR                1 (bar)
              7 LOAD_GLOBAL              2 (baz)
             10 INPLACE_ADD
             11 ROT_TWO
             12 STORE_ATTR               1 (bar)
...
This amounts to what Roy said, with x and y being temporary entries on the stack.

Terry Jan Reedy

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to