<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Fri, Feb 13, 2015 at 5:19 PM, Greg Ewing <span dir="ltr"><<a href="mailto:greg.ewing@canterbury.ac.nz" target="_blank">greg.ewing@canterbury.ac.nz</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class="">Chris Barker - NOAA Federal wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
But why does it work<br>
that way? Because it needs to work on immutable objects. If it didn't,<br>
then you wouldn't need the "assign back to the original name" step.<br>
</blockquote>
<br></span>
This doesn't make it wrong for in-place operators to<br>
work on immutable objects. There are two distinct use<br>
cases:<br>
<br>
1) You want to update a mutable object in-place.<br></blockquote><div><br></div><div>what I think this the "real" use case. ;-) </div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
2) The LHS is a complex expression that you only want<br>
   to write out and evaluate once.<br></blockquote><div><br></div><div>Can you give an example of this? how can put an expression in the right hand side? I seem to only get errors:</div><div><br></div><div><div>In [23]: l1</div><div>Out[23]: [1]</div><div><br></div><div>In [24]: l2</div><div>Out[24]: [2]</div><div><br></div><div>In [25]: (l1 + l2) += [3]</div><div>  File "<ipython-input-25-b8781c271c74>", line 1</div><div>    (l1 + l2) += [3]</div><div>SyntaxError: can't assign to operator</div><div><br></div></div><div>which makes sense -- the LHS is an expression that results in a list, but += is trying to assign to that object. HOw can there be anything other than a single object on the LHS?</div><div><br></div><div>In fact, if this worked like I expect and want it to -- that Would work. but that fat hat we've mixed in-place operation with "shorthand for operation plus assignment" makes this a mess.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">There are ways that the tuple problem could be fixed, such</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
as skipping the assignment if __iadd__ returns the same<br>
object. But that would be a backwards-incompatible change,<br>
since there could be code that relies on the assignment<br>
always happening.</blockquote><div><br></div><div>I wonder if there is are many real use cases of that -- do people really write:</div><div><br></div><div>In [28]: try:</div><div>   ....:     t[0] += [4]</div><div>   ....: except TypeError:</div><div>   ....:     pass</div><div><br></div><div>It seems making that change would let things not raise an error that would otherwise.</div><div><br></div><div>Or, I suppose, the equivalent of that try:except could be build into augmented assignment..</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class=""><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">If it's in-place for a mutable object, it needs to return self. But<br>
the python standard practice is that methods that mutate objects<br>
shouldn't return self ( like list.sort() ) for instance.<br>
</blockquote>
<br></span>
The reason for that is to catch the mistake of using a<br>
mutating method when you meant to use a non-mutating one.<br>
That doesn't apply to __iadd__, because you don't<br>
usually call it yourself.</blockquote><div><br></div><div>Sure -- but my point is that at least by convention, se keep "mutating an object" and "creating a new object" clearly distinct -- but not in this case.</div><div><br></div><div>I'm pretty convinced, band my memory of the conversation when this was added, is that the was a case of some people wanting shorthand like:</div><div><br></div><div>i += 1</div><div><br></div><div>and others wanted a way to express in-place operations conveniently:</div><div><br></div><div>array += 1</div><div><br></div><div>And this was seen as a way to kill two birds with one stone -- and that has let to this confusing behavior.</div><div><br></div><div>And BOTH are simply syntactic sugar:</div><div><br></div><div>i += 1 ==> i = i+1</div><div><br></div><div>and </div><div><br></div><div>array += 1 ==> np.add(array, 1, out=array)</div><div><br></div><div>I would argue that the seconds is a major win, and the first only a minor win.</div><div><br></div><div>( and yes, I did right a bunch of ugly code that looks like the second line before augmented assignment existed.)</div><div><br></div><div>But this is all mute -- the cast is well out of the bag on this.</div><div><br></div><div>Though if we could clean it up a bit, that would be nice.</div><div><br></div><div>-Chris</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class=""><font color="#888888"><br>
-- <br>
Greg</font></span><div class=""><div class="h5"><br>
______________________________<u></u>_________________<br>
Python-ideas mailing list<br>
<a href="mailto:Python-ideas@python.org" target="_blank">Python-ideas@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-ideas" target="_blank">https://mail.python.org/<u></u>mailman/listinfo/python-ideas</a><br>
Code of Conduct: <a href="http://python.org/psf/codeofconduct/" target="_blank">http://python.org/psf/<u></u>codeofconduct/</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><br>Christopher Barker, Ph.D.<br>Oceanographer<br><br>Emergency Response Division<br>NOAA/NOS/OR&R            (206) 526-6959   voice<br>7600 Sand Point Way NE   (206) 526-6329   fax<br>Seattle, WA  98115       (206) 526-6317   main reception<br><br><a href="mailto:Chris.Barker@noaa.gov" target="_blank">Chris.Barker@noaa.gov</a></div>
</div></div>