[Python-ideas] New 3.x restriction in list comprehensions
tjreedy at udel.edu
Fri Sep 17 23:32:04 CEST 2010
On 9/17/2010 3:44 PM, Raymond Hettinger wrote:
> In Python2, you can transform:
> r = 
> for x in 2, 4, 6:
for x in 2,4,6:
also works in 2/3.x
> r = [x*x+1 for x in 2, 4, 6]
> In Python3, the first still works but the second gives a SyntaxError.
> It wants the 2, 4, 6 to have parentheses.
> The good parts of the change:
> + it matches what genexps do
Is the restriction necessary for genexps? If the parser could handle
[x*x+1 for x in 2, 4, 6]
(x*x+1 for x in 2, 4, 6)
impossible, perhaps due to paren confusion?
> + that simplifies the grammar a bit (listcomps bodies and genexp bodies)
> + a listcomp can be reliably transformed to a genexp
> The bad parts:
> + The restriction wasn't necessary (we could undo it)
> + It makes 2-to-3 conversion a bit harder
> + It no longer parallels other paren-free tuple constructions:
> return x, y
> yield x, y
> t = x, y
> + It particular, it no longer parallels regular for-loop syntax
> The last part is the one that seems the most problematic.
> If you write for-loops day in and day out with the unrestricted
> syntax, you (or least me) will tend to do the wrong thing when
> writing a list comprehension. It is a bit jarring to get the SyntaxError
> when the code looks correct -- it took me a bit of fiddling to figure-out
> what was going on.
> My question for the group is whether it would be a good
> idea to drop the new restriction.
3.x is in a sense more consistent than 2.x in that converting a for loop
with a bare tuple always requires addition of parentheses rather than
just sometimes. Never requiring parens would be even better to me if it
did not make the implementation too messy.
Terry Jan Reedy
More information about the Python-ideas