Depois de muita pesquisa na lista de e-mails, encontrei uma declaração bastante inequívoca de que o analisador estava bem com isso. Os parênteses foram tornados obrigatórios para tornar o significado mais claro. Aqui está uma citação de Guido em 2000 na lista de discussão python-dev:
Não se preocupe. Greg Ewing não teve nenhum problema em expressar isso na gramática do Python, que é tão restrita quanto os analisadores. (É LL (1), que é equivalente a uma descida recursiva pura com um token à procura de lookahead, ou seja, sem retorno.)
Aqui está a gramática de Greg:
atom: ... | '[' [testlist [list_iter]] ']' | ...
list_iter: list_for | list_if
list_for: 'for' exprlist 'in' testlist [list_iter]
list_if: 'if' test [list_iter]
Observe que antes, a sintaxe da lista era '[' [testlist] ']'. Deixe-me explicar em termos diferentes:
O analisador analisa uma série de expressões separadas por vírgula. Anteriormente, esperava ']'como o único sinal possível após isso. Após a alteração, 'for'é outro token possível a seguir. Isso não é problema para qualquer analisador que sabe analisar parênteses correspondentes!
Se você preferir não apoiar, [x, y for ...]porque é ambíguo (para o leitor humano, não para o analisador!), Podemos mudar a gramática para algo como:
'[' test [',' testlist | list_iter] ']'
(Observe que |liga menos que concatenação e [...]significa uma parte opcional.)
Veja também a próxima resposta no tópico, onde Greg Ewing é executado
>>> seq = [1,2,3,4,5]
>>> [x, x*2 for x in seq]
[(1, 2), (2, 4), (3, 6), (4, 8), (5, 10)]
em uma versão anterior do patch de compreensão da lista e funciona muito bem.