<div dir="ltr"><div class="gmail_quote"><div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">​<span style="font-family:sans-serif"> </span></div></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
> In particularly mutating and<br>
> non-mutating operations are separated. The assignment expression breaks<br>
> this.<br>
<br>
[citation needed]<br>
<br>
In terms of blending mutating and non-mutating operations, augmented<br>
assignment is far worse. Contrast:<br>
<br>
>>> x = 1<br>
>>> y = x<br>
>>> x += 1<br>
<br>
>>> a = [1]<br>
>>> b = a<br>
>>> a += [2]<br>
<br>
<br>
Assignment expressions do the exact same thing as assignment<br>
statements, but also allow you to keep using that value. There is<br>
nothing about mutation. (Unless you believe that assignment *itself*<br>
is mutation, in which case Python is definitely the wrong language for<br>
you.)<br>
<br></blockquote><div><br></div><div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">​I think Serhiy use "mutation" as "assignment", or "changing variable".​</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">​And at this point, I'm with Serhiy.​</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">Before PEP 572, assignment is happened on very limited places.</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">When we want to use "variable x", we can check "x isn't changed from</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">value I want" very quickly, without reading full code.  For example,</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style=""><font face="monospace, monospace">  with open(some_file) as f:</font></div><div class="gmail_default" style=""><font face="monospace, monospace">      for line in f:</font></div><div class="gmail_default" style=""><font face="monospace, monospace">          line = line.rstrip()</font></div><div class="gmail_default" style=""><font face="monospace, monospace">          # some code here</font></div><div class="gmail_default" style=""><font face="monospace, monospace">          self.some_method(..., # some long arguments</font></div><div class="gmail_default" style=""><font face="monospace, monospace">                           (line := line.split())[0], line[1], # oops!</font></div><div class="gmail_default" style=""><font face="monospace, monospace">                           ...)</font></div><div class="gmail_default" style=""><font face="monospace, monospace">          # some code here</font></div><div class="gmail_default" style=""><font face="monospace, monospace">          x = {k: f for k in line if (f := k.upper()).startswith('F')} # oops!</font></div><div class="gmail_default" style=""><font face="monospace, monospace">          # some code here</font></div><div class="gmail_default" style=""><font face="monospace, monospace"><br></font></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif">Before PEP 572, we can check "f is not changed from `as f`" and "line</font></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif">is not changed from `line = line.rstrip()`" very quickly, without</font></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif">reading expressions in argument list or comprehension.</font></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif">After PEP 572, we need to read all code between place we want to use</font></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif">some variable and these variables are assigned to expected value.</font></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif">In this meaning, ​<span style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">augmented assignment is far better than assignment expression.</span></font></div><div class="gmail_default" style=""><span style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><font face="arial, helvetica, sans-serif">It's very easy to find, same to "as x" or "x =".</font></span></div><div><span style="font-family:arial,helvetica,sans-serif"><br></span></div><div><span style="font-family:arial,helvetica,sans-serif">​So PEP 572 will reduce maintainability of code written <div class="gmail_default" style="font-family:arial,helvetica,sans-serif;display:inline">​by ​</div>others<div class="gmail_default" style="font-family:arial,helvetica,sans-serif;display:inline">​ (1)</div></span><br></div><div><span style="font-family:arial,helvetica,sans-serif"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;display:inline"><br></div></span></div><div><span style="font-family:arial,helvetica,sans-serif"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;display:inline">(1) "others" including "I" in several months ago.</div></span></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif">Linters helps us sometime, but linter can't help us when others who written the code​ didn't</font></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif">use linter and it's difficult to solve every warning from linters.</font></div><br><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">​This is what I feel how PEP 572 is different from f-string or ternary expression.</div></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">f-string and ternary expression can do only what expressions can.</div><div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">But PEP 572 expands "what expressions can".</div></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">I feel PEP 572 breaks border between expression and statement, and it makes</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">readability of dirty code worse.</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">On the other hand, I understand PEP 572 allows clever code simplifies tedious</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">code.  It may increase readability of non-dirty code.  </div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">Regards,</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div></div>-- <br><div dir="ltr" class="gmail_signature">INADA Naoki  <<a href="mailto:songofacandy@gmail.com" target="_blank">songofacandy@gmail.com</a>></div></div>