(original) (raw)

On Sat, Nov 25, 2017 at 12:17 PM Brett Cannon <brett@python.org> wrote:
On Fri, Nov 24, 2017, 19:32 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.

I still propose to rule out all of the above from generator expressions, because those can escape from the surrounding scope.

+1 from me
On Sat, Nov 25, 2017 at 9:21 AM, Yury Selivanov <yselivanov.ml@gmail.com> wrote:
So we are keeping asynchronous generator expressions as long as they are defined in an 'async def' coroutine?

I would be happy to declare that \`await\` is out of scope for this thread. It seems that it is always well-defined and sensible what it does in comprehensions and in genexprs. (Although I can't help noticing that PEP 530 does not appear to propose \`await\` in generator expressions -- it proposes \`async for\` in comprehensions and in genexprs, and \`await\` in comprehensions only -- but they appear to be accepted nevertheless.)

So we're back to the original issue, which is that \`yield\` inside a comprehension accidentally makes it become a generator rather than a list, set or dict. I believe that this can be fixed. But I don't believe we should fix it. I believe we should ban \`yield\` from comprehensions and from genexprs. We don't need it, and it's confused most everyone. And the ban should extend to \`yield from\` in those same contexts. I think we have a hope for consensus on this.

(I also think that if we had invented \`await\` earlier we wouldn't have gone down the path of \`yield\` expressions -- but historically it appears we wouldn't have invented \`await\` at all if we hadn't first tried \`yield\` and then \`yield from\` to build coroutines, so I don't think this so bad after all. :-)

--
--Guido van Rossum (python.org/\~guido)