W aplikacji appengine chcę zbudować zestaw wszystkich nazw właściwości dla listy obiektów. ta powinna być dość prosta:Korzystanie z zagnieżdżonego wyrażenia generatora w Pythonie 2.7
users = security.User.all().fetch(1000)
props = set([k for k in u.properties().keys() for u in users])
Jednakże powyższy kod powoduje błąd:
File "/Users/paulkorzhyk/Projects/appengine-flask-template/app/app.py", line 70, in allusers
props = set([k for k in u.properties().keys() for u in users])
UnboundLocalError: local variable 'u' referenced before assignment
Po kilku eksperymentach w debuggera Zauważyłem, że dodanie obojętne wyrażenie rozwiązuje kod:
users = security.User.all().fetch(1000)
[u.properties().keys() for u in users]
props = set([k for k in u.properties().keys() for u in users])
jest to dość intuicyjne mi, dlaczego jest oryginalna wersja braku w Pythonie 2.7? i dlaczego dodanie "bezużytecznego" wyrażenia w środku rozwiązuje problem?
Zgodnie z tą odpowiedzią http://stackoverflow.com/questions/8049798/understanding-nested-list-comprehension powiązanie powinno być od lewej do prawej iw związku z tym zmiana kolejności instrukcji pętli powinna zostać poprawiona. – Ifthikhan