msg205920 - (view) |
Author: (ferno) |
Date: 2013-12-11 20:13 |
Document in question is: http://docs.python.org/3.3/reference/datamodel.html#object.__iadd__ The documentation states, to execute the statement x += y, where x is an instance of a class that has an __iadd__() method, x.__iadd__(y) is called. However, this doesn't appear to be strictly true. According to this, the following well-known example: >>> a = (1, [2, 3]) >>> a[1] += [4, 5] Traceback (most recent call last): File "", line 1, in TypeError: 'tuple' object does not support item assignment >>> a (1, [2, 3, 4, 5]) should give the same behaviour as: >>> a = (1, [2, 3]) >>> a[1].__iadd__([4, 5]) [2, 3, 4, 5] >>> a (1, [2, 3, 4, 5]) However, this snippet DOES give the identical behaviour: >>> a = (1, [2, 3]) >>> a[1] = a[1].__iadd__([4, 5]) Traceback (most recent call last): File "", line 1, in TypeError: 'tuple' object does not support item assignment >>> a (1, [2, 3, 4, 5]) which leads me to suggest that this line of the documentation should be adjusted to read: to execute the statement x += y, where x is an instance of a class that has an __iadd__() method, x = x.__iadd__(y) is called. This fix would incidentally harmonise with the documentation for operator.iadd() et al., (http://docs.python.org/3.3/library/operator.html#operator.iadd), which had a similar problem but was corrected following issue 7259 (http://bugs.python.org/issue7259), now reading: a = iadd(a, b) is equivalent to a += b. |
|
|
msg206163 - (view) |
Author: Terry J. Reedy (terry.reedy) *  |
Date: 2013-12-14 02:55 |
The current doc is correct. Unlike the old incorrect version of the operator doc (#7259), it does not say that the call is all of the execution. The suggested replacement "x = x.__iadd__(y) is called" is not correct as statements are not called. The said, it seems that some people miss the fact that augmented assignment always does an assignment. So, considering that the first sentence of the paragraph, "These methods are called to implement the augmented arithmetic assignments (+=, -=, *=, /=, //=, %=, **=, <<=, >>=, &=, ^=, |=)." already talks about calling, I thing "For instance, to execute the statement x += y, where x is an instance of a class that has an __iadd__() method, x.__iadd__(y) is called. If x is an instance of a class that does not define a __iadd__() method, x.__add__(y) and y.__radd__(x) are considered, as with the evaluation of x + y." might be replaced by "For instance, if x is an instance of a class with an __iadd__() method, x += y is equivalent to x = x.__iadd__(y) . Otherwise, x.__add__(y) and y.__radd__(x) are considered, as with the evaluation of x + y." |
|
|
msg212980 - (view) |
Author: R. David Murray (r.david.murray) *  |
Date: 2014-03-09 19:42 |
I wonder if it would be worth adding a sentence that says, "In certain situations, augmented assignment can result in unexpected errors (see http://docs.python.org/3/faq/programming.html#id44)." |
|
|
msg212999 - (view) |
Author: Roundup Robot (python-dev)  |
Date: 2014-03-09 22:52 |
New changeset f9cb5a44879c by R David Murray in branch '3.3': #19953: Clarify the wording of the augmented assignment discussion. http://hg.python.org/cpython/rev/f9cb5a44879c New changeset 61ceb299a255 by R David Murray in branch 'default': Merge #19953: Clarify the wording of the augmented assignment discussion. http://hg.python.org/cpython/rev/61ceb299a255 |
|
|
msg213000 - (view) |
Author: R. David Murray (r.david.murray) *  |
Date: 2014-03-09 22:57 |
Thanks, Pryia. |
|
|