2016-09-16 4 views
3

CPython 2.7.10と3.4.3とPyPy 2.6.0(Python 2.7.9)では、forループの名前リストに式(またはそれらのサブセット)を使用することは明らかです。ここではforループの典型的です:for-loopの名前リスト式は合法ですか?

>>> for a in [1]: pass 
... 
>>> a 
1 

しかし、あなたはまた、オブジェクトから属性を使用することができます。

>>> class Obj(object): pass 
... 
>>> obj = Obj() 
>>> for obj.b in [1]: pass 
... 
>>> obj.b 
1 

あなたも表現から属性を使用することができます。

>>> for Obj().c in [1]: pass 
... 

ではなく、すべての式を動作するように見える:

>>> for (True and obj.d) in [1]: pass 
... 
    File "<stdin>", line 1 
SyntaxError: can't assign to operator 

しかし、属性が外部にある限り、それらは長いですか?

>>> for (True and obj).e in [1]: pass 
... 
>>> obj.e 
1 

何かが割り当てられますか?

>>> for {}['f'] in [1]: pass 
... 

私はこれらのうちのいずれかがPythonの正当な構文であることに驚いています。私は名前だけが許されると思った。これらも機能するはずですか?これは見落としですか?これは、PyPyが実装しているCPythonの実装の詳細ですか?

+0

'(Trueおよびobj).e =" hello "'有効な構文ですか? –

+0

...自分の質問に答える:いいえ、そうではありません。 –

+0

'for k、v dictionary.items()'はどうですか? –

答えて

5

これらは動作するはずですか?

はい

これは監督ですか?

これはPyPyも 実装に起こることはCPythonの実装の詳細ですか?


あなたがそれに割り当てることができる場合は、のために、ループ内の自由変数として使用することができます。このような質問のために

、それはgrammarにまっすぐに行く価値があります:

for_stmt ::= "for" target_list "in" expression_list ":" suite 
       ["else" ":" suite] 

target_listtargetのちょうど束である:

target_list  ::= target ("," target)* [","] 
target   ::= identifier 
        | "(" target_list ")" 
        | "[" [target_list] "]" 
        | attributeref 
        | subscription 
        | slicing 
        | "*" target 

あなたが密接にその見れば、あなた'LLあなたが与えた作業例のどれも反例ではないことを見てください。気をつけてください。パーザのバグは(even I found one once)聞いたことがないので、合法的な構文異常を見つけたら、チケットを提出することで、これらはすぐに修正される傾向があります。

あなたが与えた最も興味深いのペアは、論理的には同じように見えるが、別々に解析され(True and obj.d)(True and obj).d、次のとおりです。

>>> ast.dump(ast.parse('(True and obj.d)'), annotate_fields=False) 
"Module([Expr(BoolOp(And(), [Name('True', Load()), Attribute(Name('obj', Load()), 'd', Load())]))])" 
>>> ast.dump(ast.parse('(True and obj).d'), annotate_fields=False) 
"Module([Expr(Attribute(BoolOp(And(), [Name('True', Load()), Name('obj', Load())]), 'd', Load()))])" 

注:(True and obj).dは文法でattributerefです。

1

documentedとして、for構文で「可変」also documentedとして代入文の左辺にすることができ何を意味し、任意のtarget_list、することができます。 (True and obj.d)のようなものを使うことはできません。値を割り当てる方法がないからです。

関連する問題