Nach vielem Ausgraben der Mailingliste habe ich eine ziemlich eindeutige Aussage gefunden, dass der Parser damit einverstanden war. Die Klammern wurden obligatorisch gemacht, um die Bedeutung klarer zu machen. Hier ist ein Zitat von Guido aus dem Jahr 2000 auf der Python-Dev-Mailingliste:
Mach dir keine Sorgen. Greg Ewing hatte kein Problem damit, dies in Pythons eigener Grammatik auszudrücken, die ungefähr so eingeschränkt ist, wie Parser kommen. (Es ist LL (1), was einem reinen rekursiven Abstieg mit einem Lookahead-Token entspricht, dh ohne Rückverfolgung.)
Hier ist Gregs Grammatik:
atom: ... | '[' [testlist [list_iter]] ']' | ...
list_iter: list_for | list_if
list_for: 'for' exprlist 'in' testlist [list_iter]
list_if: 'if' test [list_iter]
Beachten Sie, dass zuvor die Listensyntax lautete '[' [testlist] ']'. Lassen Sie es mich anders erklären:
Der Parser analysiert eine Reihe von durch Kommas getrennten Ausdrücken. Zuvor erwartete es ']'als einzig mögliches Token danach. Nach der Änderung 'for'ist ein weiteres mögliches Folgetoken möglich. Dies ist überhaupt kein Problem für jeden Parser, der weiß, wie man passende Klammern analysiert!
Wenn Sie es lieber nicht unterstützen möchten, [x, y for ...]weil es nicht eindeutig ist (für den menschlichen Leser, nicht für den Parser!), Können wir die Grammatik wie folgt ändern:
'[' test [',' testlist | list_iter] ']'
(Beachten Sie, dass |weniger als Verkettung gebunden ist und [...]einen optionalen Teil bedeutet.)
Siehe auch die nächste Antwort im Thread, in dem Greg Ewing läuft
>>> seq = [1,2,3,4,5]
>>> [x, x*2 for x in seq]
[(1, 2), (2, 4), (3, 6), (4, 8), (5, 10)]
auf einer frühen Version des Listenverständnis-Patches, und es funktioniert gut.