(original) (raw)

On 23 November 2017 at 13:45, Paul Moore <p.f.moore@gmail.com> wrote:
On 23 November 2017 at 12:28, Ivan Levkivskyi <levkivskyi@gmail.com> wrote:
\> On 23 November 2017 at 13:11, Paul Moore <p.f.moore@gmail.com> wrote:
\>>
\>> On 23 November 2017 at 12:01, Ivan Levkivskyi <levkivskyi@gmail.com>
\>> wrote:
\>>
\>> > "I don't use it, therefore it is not needed" is a great argument,
\>> > thanks.
\>> > Lets just forget about two SO questions and dozens people who up-voted
\>> > it.
\>> > Do you use async comprehensions? If not, then we don't need them either.
\>>
\>> For those of us trying to keep up with the discussion who don't have
\>> time to chase the various references, and in the interest of keeping
\>> the discussion in one place, can you summarise the real-world use
\>> cases from the SO questions here? (I assume they are real world cases,
\>> and not just theoretical questions)
\[...\]
\>
\> My understanding is that none of the case is \_pressing\_, since they all
\> start with a for-loop, but
\> following this logic comprehensions themselves are not needed. Nevertheless
\> people use them because they like it.
\> The problem in all four cases is that they got hard to debug problem, since
\> calling \`f()\` returns a generator,
\> just not the one they would expect.

OK, thanks. I can see why someone would want to do this. However, it
seems to me that the problem (a hard to debug error) could be solved
by disallowing yield in comprehensions and generator expressions
(giving an \*easy\* to debug error). I don't think the above is a
compelling argument that we have to support the one-line form. If
there was a non-trivial body of actual user code that uses the loop
form, which would be substantially improved by being able to use
comprehensions, that would be different. To put it another way, the
example you gave is still artificial. The second link is a real use
case, but as you say seems to be more a question about "why did this
not work as I expected" which could be solved with a SyntaxError
saying "yield expression not allowed in comprehensions".

The level of "artificialness" is quite subjective, this is rather matter of taste (see the tornado example).
Let us forget for a moment about other problems and focus on this one: list comprehension is currently not equivalent to a for-loop.
There are two options:
- Fix this, i.e. make comprehension equivalent to a for-loop even in edge cases (Serhiy seems ready to do this)
- Prohibit all cases when they are not equivalent

I still prefer option one. But I see your point, option two is also an acceptable fix.
Note that there were not so many situations when some code became SyntaxError later.
I don't see why this particular case qualifies for such a radical measure as an exception to syntactic rules,
instead of just fixing it (sorry Nick :-)

--
Ivan