2017-07-14 29 views
3

タプルを含むジェネレータ式に角括弧(特にかっこ)が必要なのはなぜですか?ジェネレータの式と角括弧

なぜ

((x, y) 
for x in range(10) 
for y in range(20)) 

代わりに

(x, y 
for x in range(10) 
for y in range(20)) 

SyntaxError: invalid syntax 
+2

後者は一種の曖昧です。通常のタプルのように始まりますが、解析の後半でジェネレータになります。 (ジェネレータだけでなく、リスト内包表記でも) –

+0

はい:悪い回答を受け入れる – Har

答えて

4

後者の種類の曖昧である:それは、通常のタプルと同様に開始するが、その後の解析で発生することが判明しました。たぶん、(1, 2, 3, 4, x for x in range(10))のように2つ以上の要素があると、これはもっと明らかになります。

これは、grammar specificationでも見ることができる。

expressionx, yよう​​(とりわけ)

atom  ::= identifier | literal | enclosure 
enclosure ::= parenth_form | list_display 
       | generator_expression | dict_display | set_display 
       | string_conversion | yield_atom 
parenth_form ::= "(" [expression_list] ")" 
expression_list ::= expression ("," expression)* [","] 

すなわちexpression_listまで沸騰は、括弧で囲まれなければならない

generator_expression ::= "(" expression comp_for ")" 

a = b, cのような割り当てではなく、直接使用することができます)。

assignment_stmt ::= (target_list "=")+ (expression_list | yield_expression) 

(発電のため、また、リストの内包のため、また、Pythonの3だけではなく)

+0

スペックを調べるのに1が、本当にあいまいですか?一度全体の表現を調べることはありませんか? –

+0

@Chris_Rands:* inspection *は明らかですが、パーザはそれ自体を検査せず、入力トークンをトークンで読み取り、文法のパターンマッチを探します。 –

+1

@ IgnacioVazquez-Abrams私はあなたの意見を述べていますが、 'for'と' in'キーワードはパーサーで検出するのに十分なはずですか?私はしばしば '[a、int(b)for zip(lst1、lst2)]'のようなものを誤って書くことがあります。 –