As expressões da lista de nomes de loop for são legais?
No CPython 2.7.10 e 3.4.3 e no PyPy 2.6.0 (Python 2.7.9), aparentemente é legal usar expressões (ou algum subconjunto delas) para a lista de nomes em um loop for. Aqui está um loop for típico:
>>> for a in [1]: pass
...
>>> a
1
Mas você também pode usar atributos de objetos:
>>> class Obj(object): pass
...
>>> obj = Obj()
>>> for obj.b in [1]: pass
...
>>> obj.b
1
E você pode até usar atributos de expressões:
>>> for Obj().c in [1]: pass
...
Mas nem todas as expressões parecem funcionar:
>>> for (True and obj.d) in [1]: pass
...
File "<stdin>", line 1
SyntaxError: can't assign to operator
Mas eles fazem desde que o atributo esteja do lado de fora?
>>> for (True and obj).e in [1]: pass
...
>>> obj.e
1
Ou algo é atribuível?
>>> for {}['f'] in [1]: pass
...
Estou surpreso que qualquer uma dessas sintaxe seja legal em Python. Eu esperava que apenas nomes fossem permitidos. Eles deveriam funcionar? Isso é um descuido? Esse é um detalhe de implementação do CPython que o PyPy também implementa?