[Python-Dev] Tricky way of of creating a generator via a comprehension expression (original) (raw)

Nathaniel Smith njs at pobox.com
Fri Nov 24 20:06:33 EST 2017


On Fri, Nov 24, 2017 at 4:22 PM, Guido van Rossum <guido at 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.

I would say that banning yield and yield from is like banning return and break, but banning await is like banning function calls. There's no reason for most users to even know that await is related to generators, so a rule disallowing it inside comprehensions is just confusing. AFAICT 99% of the confusion around async/await is because people think of them as being related to generators, when from the user point of view it's not true at all and await is just a funny function-call syntax.

Also, at the language level, there's a key difference between these cases. A comprehension has implicit yields in it, and then mixing in explicit yields as well obviously leads to confusion. But when you use an await in a comprehension, that turns it into an async generator expression (thanks to PEP 530), and in an async generator, yield and await use two separate, unrelated channels. So there's no confusion or problem with having await inside a comprehension.

-n

-- Nathaniel J. Smith -- https://vorpus.org



More information about the Python-Dev mailing list