
2017-11-27 17:14 GMT+03:00 Chris Angelico <rosuav@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, like: 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