For loop comprehensions

Benjamin S Wolf bswolf at
Sat Feb 12 09:27:43 CET 2011

On Feb 11, 3:47 pm, Westley Martínez <aniko... at> wrote:
> No, too confusing. Then people'll want compound loops e.g.:
> for a in b if c while d else return x:
>     print('Ha ha I'm so clever!')

On Feb 11, 6:34 pm, Steven D'Aprano <steve
+comp.lang.pyt... at> wrote:
> There's nothing wrong with writing
> for x in iterable:
>     if condition(x):
>         process(x)
> The existing syntax is clear and obvious. There's no clear benefit to
> shifting the if clause to the for expression: it complicates the parser,
> and any benefit (if any!) only applies to a tiny fraction of for loops.
> You save one line, which is trivial. You may save one indentation level,
> which might, sometimes, be useful, but more often will also be trivial.
> If there's an advantage to the suggestion, it's small.

My reasons for suggesting this are more to align for-loop syntax with
generator expression/list comprehension syntax than to add completely
new functionality to for-loops. I had observed that what I had typed
initially before realizing it was incorrect:

  for a in b if c:

was equivalent (and nearly syntactically so) to

  [f(a) for a in b if c]

minus the generation of a list.

I understand there are more verbose ways to accomplish the same goal
(such as filter or multiple lines). But there are also more verbose
ways to construct a list (such as filter or multiple lines). That is
why I decided to suggest it.

On Feb 11, 7:54 pm, Terry Reedy <tjre... at> wrote:
> Already proposed and rejected. See archives for python-ideas or the
> gmane.comp.python.ideas mirror.

Thanks for pointing me in the right direction, and sorry for bringing
it up a third (if not more!) time.

For posterity,,
and earlier,

The latter brings up a good point about parsing: how will we be sure
after reading 'for a in b if c' whether this is a comprehension or
whether (b if c) begins a ternary expression (and we should expect a
'else d' to follow). Well, my suggestion is to bring for-loop syntax
in line with comprehension syntax, and:

>>> [a for a in range(10) if False else [99]]
SyntaxError: invalid syntax
>>> [a for a in (range(10) if False else [99])]
>>> for a in range(10) if False else [99]:

So as it stands now in 3.1, comprehensions don't permit the ternary
expression without parenthesizing it, but for-loops do. So my
suggestion would have the side effect of requiring parentheses for
that latter expression, as comprehensions do. :/

Thanks again,

More information about the Python-list mailing list