たくさんのメーリングリストを掘り下げた後、私はパーサーがそれで大丈夫だというかなり明白なステートメントを見つけました。括弧は、意味を明確にするために必須にされました。2000年にpython-devメーリングリストでGuido が引用した引用は次のとおりです。
心配しないで。Greg Ewingは、これをPython独自の文法で問題なく表現しました。これは、パーサーが来るのと同じくらい制限されています。(これはLL(1)であり、1つの先読みトークンを持つ純粋な再帰的下降に相当します。つまり、バックトラッキングはありません。)
ここにグレッグの文法があります:
atom: ... | '[' [testlist [list_iter]] ']' | ...
list_iter: list_for | list_if
list_for: 'for' exprlist 'in' testlist [list_iter]
list_if: 'if' test [list_iter]
以前は、リストの構文はでした'[' [testlist] ']'。別の言葉で説明しましょう:
パーサーは、一連のコンマ区切りの式を解析します。以前は、これに']'続く唯一の可能なトークンとして期待されていました。変更後、'for'次のトークンが考えられます。これは、一致する括弧を解析する方法を知っているどのパーサーにとってもまったく問題ありません!
[x, y for ...](パーサーではなく人間の読者にとって)あいまいであるためにサポートしたくない場合は、文法を次のように変更できます。
'[' test [',' testlist | list_iter] ']'
(|連結よりもバインドが少なく[...]、オプションの部分を意味することに注意してください。)
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)]
リスト理解パッチの初期のバージョンでは、それはうまくいきます。