¿Son legales las expresiones de la lista de nombres para el bucle?
En CPython 2.7.10 y 3.4.3, y PyPy 2.6.0 (Python 2.7.9), aparentemente es legal usar expresiones (o algún subconjunto de ellas) para la lista de nombres en un bucle for. Aquí hay un típico bucle for:
>>> for a in [1]: pass
...
>>> a
1
Pero también puede usar atributos de objetos:
>>> class Obj(object): pass
...
>>> obj = Obj()
>>> for obj.b in [1]: pass
...
>>> obj.b
1
E incluso puedes usar atributos de expresiones:
>>> for Obj().c in [1]: pass
...
Pero no todas las expresiones parecen funcionar:
>>> for (True and obj.d) in [1]: pass
...
File "<stdin>", line 1
SyntaxError: can't assign to operator
¿Pero lo hacen mientras el atributo esté afuera?
>>> for (True and obj).e in [1]: pass
...
>>> obj.e
1
¿O algo es asignable?
>>> for {}['f'] in [1]: pass
...
Me sorprende que cualquiera de estos sean sintaxis legal en Python. Esperaba que solo se permitieran nombres. ¿Se supone que estos funcionan? ¿Es esto un descuido? ¿Es este un detalle de implementación de CPython que PyPy también implementa?