タプルを含むジェネレータ式に角括弧(特にかっこ)が必要なのはなぜですか?ジェネレータの式と角括弧
なぜ
((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
タプルを含むジェネレータ式に角括弧(特にかっこ)が必要なのはなぜですか?ジェネレータの式と角括弧
なぜ
((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
後者の種類の曖昧である:それは、通常のタプルと同様に開始するが、その後の解析で発生することが判明しました。たぶん、(1, 2, 3, 4, x for x in range(10))
のように2つ以上の要素があると、これはもっと明らかになります。
これは、grammar specificationでも見ることができる。
expression
後
x, 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だけではなく)
スペックを調べるのに1が、本当にあいまいですか?一度全体の表現を調べることはありませんか? –
@Chris_Rands:* inspection *は明らかですが、パーザはそれ自体を検査せず、入力トークンをトークンで読み取り、文法のパターンマッチを探します。 –
@ IgnacioVazquez-Abrams私はあなたの意見を述べていますが、 'for'と' in'キーワードはパーサーで検出するのに十分なはずですか?私はしばしば '[a、int(b)for zip(lst1、lst2)]'のようなものを誤って書くことがあります。 –
後者は一種の曖昧です。通常のタプルのように始まりますが、解析の後半でジェネレータになります。 (ジェネレータだけでなく、リスト内包表記でも) –
はい:悪い回答を受け入れる – Har