After having followed this thread for a while, it occured to me that the reason that the idea is confusing, is because the spelling is confusing.
I think the suggested spelling (`*`) is the confusing part. If it were to be spelled `from ` instead, it would be less confusing. Consider this: g = (f(t) for t in iterable) is "merely" sugar for def gen(): for t in iterable: yield f(t) g = gen() Likewise, l = [f(t) for t in iterable] can be seen as sugar for def gen(): for t in iterable: yield f(t) l = list(gen()) Now the suggested spelling l = [*f(t) for t in iterable] is very confusing, from what I understand: what does the `*` even mean here. However, consider the following spelling: l = [from f(t) for t in iterable] To me, it does not seem far-fetched that this would mean: def gen(): for t in iterable: yield from f(t) l = list(gen()) It follows the "rule" quite well: given a generator display, everything before the first "for" gets placed after "yield ", and all the `for`/`if`s are expanded to suites. Now I'm not sure if I'm a fan of the idea, but I think that at least the `from `-spelling is less confusing than the `*`-spelling. (Unless I totally misunderstood what the `*`-spelling was about, given how confusing it supposedly is. Maybe it confused me.) On Fri, Oct 14, 2016 at 03:55:46AM +1100, Steven D'Aprano wrote: > On Thu, Oct 13, 2016 at 04:34:49PM +0200, Martti Kühne wrote: > > > > If I had seen a list comprehension with an unpacked loop variable: > > > > > > [t for t in [(1, 'a'), (2, 'b'), (3, 'c')]] > > Marttii, somehow you have lost the leading * when quoting me. What I > actually wrote was: > > [*t for t in [(1, 'a'), (2, 'b'), (3, 'c')]] > > > > As it happens, python does have an external consumption operation that > > happens externally with an iteration implied: > > > > for t in iterable: > > yield t > > If you replace the t with *t, you get a syntax error: > > > py> def gen(): > ... for t in [(1, 'a'), (2, 'b'), (3, 'c')]: > ... yield *t > File "<stdin>", line 3 > yield *t > ^ > SyntaxError: invalid syntax > > Even if it was allowed, what would it mean? It could only mean "unpack > the sequence t, and collect the values into a tuple; then yield the > tuple". > > > > > For your example [t for t in [(1, 'a'), (2, 'b'), (3, 'c')]] that would > > mean: > > > > for t in [(1, 'a'), (2, 'b'), (3, 'c')]: > > yield t > > > > And accordingly, for the latter case [*t for t in [(1, 'a'), (2, 'b'), > > (3, 'c')]] it would be: > > > > for item in [(1, 'a'), (2, 'b'), (3, 'c')]: > > for t in item: > > yield t > > No it wouldn't. Where does the second for loop come from? The list > comprehension shown only has one loop, not nested loops. > > > > -- > Steve > _______________________________________________ > Python-ideas mailing list > Python-ideas@python.org > https://mail.python.org/mailman/listinfo/python-ideas > Code of Conduct: http://python.org/psf/codeofconduct/ _______________________________________________ Python-ideas mailing list Python-ideas@python.org https://mail.python.org/mailman/listinfo/python-ideas Code of Conduct: http://python.org/psf/codeofconduct/