On 25 November 2017 at 16:57, Guido van Rossum <guido@python.org> wrote:On Sat, Nov 25, 2017 at 6:55 AM, Ivan Levkivskyi <levkivskyi@gmail.com> wrote:On 25 November 2017 at 04:30, Guido van Rossum <guido@python.org> wrote:On Fri, Nov 24, 2017 at 4:22 PM, Guido van Rossum <guido@python.org> wrote:The more I hear about this topic, the more I think that `await`, `yield` and `yield from` should all be banned from occurring in all comprehensions and generator expressions. That's not much different from disallowing `return` or `break`.From the responses it seems that I tried to simplify things too far. Let's say that `await` in comprehensions is fine, as long as that comprehension is contained in an `async def`. While we *could* save `yield [from]` in comprehensions, I still see it as mostly a source of confusion, and the fact that the presence of `yield [from]` *implicitly* makes the surrounding `def` a generator makes things worse. It just requires too many mental contortions to figure out what it does.[...]If the first example will be allowed, then one will be surprised why it can't be rewritten asdef pack_two():return [(yield) for _ in range(2)]And yet Nick's example shows that that is not equivalent![...]In this example each thing that looks syntactically like a list comprehension becomes actually a generator expression at at runtime! And so does your example, so instead of a list of two items, it returns a generator that will produce two values when iterated over.That's not referential transparency to me, it feels more like a bug in the code generator.I want to ban this because apparently nobody besides Nick knows about this behavior (I certainly didn't, and from the above it seems you don't either).This whole thread started as a proposal to fix this bug and to make the two forms equivalent, so I don't know what you are talking about.
Also as there appeared arguments of authority (thanks Antoine) its time to stop this discussion for me.