[Python-Dev] PEP 572: Assignment Expressions (original) (raw)
Tim Peters tim.peters at gmail.com
Tue Apr 17 21:35:35 EDT 2018
- Previous message (by thread): [Python-Dev] PEP 572: Assignment Expressions
- Next message (by thread): [Python-Dev] PEP 572: Assignment Expressions
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
[Guido, makes peace with identifier := expression
]
... I am fine with this, it certainly seems the easiest to implement, with the fewest corner cases, and the easiest restriction to explain.
(I was thinking there would be a use case for basic tuple unpacking, like seen a lot in for-loop, but the only examples I tried to come up with were pretty sub-optimal, so I don't worry about that any more.)
Chris's pain threshold appears to be higher than ours ;-)
So I would really like to see if anyone has plausibly realistic uses for fancier forms of assignment expression.
I have plenty of code that does stuff like this:
while True:
x, y = func_returning_tuple()
if y is None:
break
...
Maybe it's just that I'm used to it, but I find that very easy to understand now. If we had fancy assignment expressions, my first thought was I could write it like so instead:
while ((x, y) := func_returning_tuple()) and y is not None:
...
and pray that I put in enough parens to get the intended meaning.
And maybe it's just that I'm not used to that, but I do find it
harder to understand. Contributing factor: I don't really want "and"
there - what the context requires is really more like C's comma
operator (take only the last value from a sequence of expressions).
As is, I'm relying on that a 2-tuple is truthy regardless of its
content (so that and
always goes on to evaluate its RHS).
And, for some reason, I find this even worse:
while ((x, y) := func_returning_tuple())[1] is not None:
...
The rub there: I gave y
a name but can't use it in the test?!
And those are the same kinds of headaches I saw over & over in my own "fancier" code: stuff that's already perfectly clear would become more obscure instead.
Tuple unpacking works great in for-loops because the only effect there
is to give names to the tuple components, none of which are needed
in the for
statement itself. But in a while" or
ifstatement, I would typically _also_ want to use the names _in_ the
whileor
if` tests. But, as in C, that's what the comma operator is for, not
the assignment operator.
while (s = function_returning_struct_with_x_and_y_members(), s.y != NULL) {
...
}
In contrast, ,many plausible uses I saw for identifier := expression
in a while
or if
statement would have been improvements, and most
of the rest neutral: I'm still wondering whether this one is better
or worse ;-):
def newton(f, fprime, x):
import math
while not math.isclose((next_x := x - f(x) / fprime(x)), x):
x = next_x
return next_x
- Previous message (by thread): [Python-Dev] PEP 572: Assignment Expressions
- Next message (by thread): [Python-Dev] PEP 572: Assignment Expressions
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]