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)

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. I thought the whole idea of __iadd__(self, other) is that it's supposed to mutate self. So, why is there another assignment happening after the __iadd__() call?

The formal name of the __iop__ is "agumented assignment". The name doesn't talk about in-place; but it does talk about assignment. The semantic defines that augmented assignment operation is done in-place *when the left-hand side object supports it* (i.e. it does not require in-place mutation).

"""
The __iadd__ hook should behave similar to __add__, returning the result of the operation (which *could* be `self') which is to be assigned to the variable `x'.
"""

For a more complete description, see: http://www.python.org/dev/peps/pep-0203/
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to