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?

questionAnswers(2)

yourAnswerToTheQuestion