Hello,

Thanks for the reply.


On Fri, 5 Feb 2021 13:32:25 -0500
Terry Reedy <tjre...@udel.edu> wrote:

> On 2/5/2021 2:51 AM, Paul Sokolovsky wrote:
> 
> > https://www.python.org/dev/peps/pep-0572/  
> ...
> 
> >>>> ((a, b) := (1, 2))  
> >    File "<stdin>", line 1
> > SyntaxError: cannot use assignment expressions with tuple
> > ----
> > 
> > Why this accidental syntactic gap?  
> 
> As should be clear from reading "Differences between assignment 
> expressions and assignment statements", this 'gap' in entirely 
> intentional, not accidental.  *All* elaborations of 'name :=
> expression' are listed and rejected as outside the scope of the
> proposal, which was to keep one reference to the expression value for
> later use.  At least some of these elaborations were suggested and
> rejected during the voluminous discussion.

And looking back now, that seems like intentionally added accidental
gap in the language (https://en.wikipedia.org/wiki/Accidental_gap).
Similar to artificially limiting decorator syntax, which was already
un-limited. But seems, there're no "lessons learned", and there's now
need to wait a decade again before fixing that?

> The principal a.e. use in conditional expressions is testing for 
> non-nullness.  Your
> 
>  > while ((a1, b1) := phi([a0, a2], [b0, b2]))[0] < 5:
>  >    a2 = a1 + 1
>  >    b2 = b1 + 1  
> 
> is an unusual and very specific use. 

Well, many people were thinking (and I bet still think) that ":="
itself is very unusual case. But if it's in, why not make it consistent
with the assignment statement and unleash the full power of it?

> You want to have your tuple
> (for subscripting for testing) and eat it too (by unpacking). 

That's good characterization, thanks. And Python syntax alone would
allow to do that, if not extra-syntactical limitations put on top of it.

> One can instead separate unpacking from testing a couple of ways
> 
> while (tup := phi([a0, a2], [b0, b2]))[0] < 5:
>      a2, b2 = tup
>      a2 = a1 + 1
>      b2 = b1 + 1
> 
> 
> while True:
>      a1, b1 = phi([a0, a2], [b0, b2])
>      if a1 >= 5: break
>      a2 = a1 + 1
>      b2 = b1 + 1

Right, but I started my original email with "I finally found a usecase
where *not* using assignment expression is *much* worse than using it."
Both conversions above apply additional disturbances to the original
program, beyond pure SSA conversion, which is quite a disturbance on
its own. I was really excited that Python 3.7+ would be *the* language
which would allow to express SSA conversion faithfully on the source
form of the high-level language (usually SSA is applied to low-level
assembly-like intermediate representation). But oops, accidental gap,
and despite all the Python advanceness, still need to apply workarounds
as with other mundane languages.

[]

-- 
Best regards,
 Paul                          mailto:pmis...@gmail.com
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-le...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at 
https://mail.python.org/archives/list/python-dev@python.org/message/X3LNCCO6PHTLAQXHEAP6T3FFW5ZW5GR5/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to