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