[Python-ideas] How assignment should work with generators?

Kirill Balunov kirillbalunov at gmail.com
Mon Nov 27 09:35:25 EST 2017

> > To show this on simple example:
> >
> > >>> from itertools import count, islice
> > >>> it = count()
> > >>> x, y = it
> > >>> it
> > count(3)
> For everyone else who was confused by this, as I was, that's not
> actually a copy and paste from the REPL. There should be a ValueError
> raised after the x, y assignment. As given, it is confusing because it
> looks like the assignment succeeded, when in fact it didn't.
> > Here the count was advanced two times but assignment did not happen.
> Correct, because there was an exception raised.

Sorry for that, I did not want to embarrass anyone, so I wrote below that
the assignment did not happen. But probably the code should speak for
itself, especially if it looks like a copy from REPL

> if isinstance(it, collections.abc.Iterator):
>     # special case for iterators
>     x, y = it
> else:
>     # sequences keep the old behaviour
>     x, y = it[:2]

No, it can be simply x, y = iter(it)

> > Cons:
> >     1. A special case of how assignment works
> >     2. As with any implicit behavior, hard-to-find bugs
> Right. Hard-to-find bugs beats any amount of convenience in the
> interactive interpreter. To use an analogy:
> "Sure, sometimes my car suddenly shifts into reverse while I'm driving
> at 60 kph, sometimes the engine falls out when I go around the corner,
> and occasionally the brakes catch fire, but gosh the cup holder makes it
> really convenient to drink coffee while I'm stopped at traffic lights!"


Perhaps a better idea might be special syntax to tell the interpreter
> you don't want to run the right-hand side to completion. "Explicit is
> better than implicit" -- maybe something special like:
> x, y, * = iterable

I wrote somewhere above, that "may be I like this form". But for me *
'"starred" target implies -> collect something from iterable. So now I'm

x, y, ... = iterable

But I have not summed up yet what pitfalls can be on this path.

Thank you your remarks were very extensive!

With kind regards, -gdg
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20171127/333516fa/attachment.html>

More information about the Python-ideas mailing list