Después de un montón de búsqueda en la lista de correo, he encontrado una declaración bastante inequívoca de que el analizador estaba de acuerdo. Los paréntesis se hicieron obligatorios para aclarar el significado. Aquí hay una cita de Guido en 2000 en la lista de correo python-dev:
No te preocupes Greg Ewing no tuvo problemas para expresar esto en la propia gramática de Python, que es tan restringida como los analizadores. (Es LL (1), que es equivalente a un descenso recursivo puro con una ficha anticipada, es decir, sin retroceso).
Aquí está la 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]
Tenga en cuenta que antes, la sintaxis de la lista era '[' [testlist] ']'. Déjame explicarte en diferentes términos:
El analizador analiza una serie de expresiones separadas por comas. Anteriormente, se esperaba ']'como el único token posible después de esto. Después del cambio, 'for'es otro token de seguimiento posible. ¡Esto no es un problema en absoluto para cualquier analizador que sepa cómo analizar paréntesis coincidentes!
Si prefiere no apoyarlo [x, y for ...]porque es ambiguo (¡para el lector humano, no para el analizador!), Podemos cambiar la gramática a algo como:
'[' test [',' testlist | list_iter] ']'
(Tenga en cuenta que se |une menos que la concatenación y [...]significa una parte opcional).
También vea la siguiente respuesta en el hilo, donde corre Greg Ewing
>>> seq = [1,2,3,4,5]
>>> [x, x*2 for x in seq]
[(1, 2), (2, 4), (3, 6), (4, 8), (5, 10)]
en una versión anterior del parche de comprensión de la lista, y funciona bien.