[Python-ideas] How assignment should work with generators?
kirillbalunov at gmail.com
Mon Nov 27 09:50:29 EST 2017
2017-11-27 17:14 GMT+03:00 Chris Angelico <rosuav at gmail.com>:
> Nah, far easier:
> x, y = iter(it)
Yes, you are right.
>> 2. Readable and not so verbose code
> >> 3. Optimized case for x,y,*z = iterator
> > The semantics of that are already set: the first two items are assigned
> > to x and y, with all subsequent items assigned to z as a list. How will
> > this change optimize this case? It still needs to run through the
> > iterator to generate the list.
> Maybe 'optimized case for "x, y, *_ = iterator" where you then never
> use _ and it has no side effects'? But that could be worded better.
Yes, you did not need to consume and then to throw out _, and in other
cases not to hang in an endless loop.
> I do think islice is verbose, but the main problem is that you have to
> match the second argument to the number of assignment targets. Slice
> notation is an improvement, but it still has that same problem.
> But perhaps this should be added to the list of options for the PEP.
Inconvenience is that in both cases: islice and iter[:2], you should
specify the exact number of assignment targets.
> That's one of the options that I mentioned, as it's been proposed in
> the past. The problem is that it depends on internal whitespace to
> distinguish it from augmented assignment; granted, there's no way to
> use "*=" with multiple targets (or even in the single-target case, you
> can't do "x,*=it" with the comma in it), but that's still a
> readability problem.
Your suggestion using Ellipsis at the moment seems to me the most readable,
x, ... = iterable
x, y, ... = iterable
But I have not summed up yet what pitfalls can be on this path.
I really do not like to use "starred" targets in any way:
x, y, * = iterable
x, y, *...
Because any "starred" target implies consuming or collecting, and
contradicts with the proposed behavior.
With kind regards, -gdg
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Python-ideas