In un'applicazione appengine, voglio creare un insieme di tutti i nomi di proprietà per un elenco di oggetti. Questo dovrebbe essere abbastanza semplice:Utilizzo dell'espressione del generatore annidato in Python 2.7
users = security.User.all().fetch(1000)
props = set([k for k in u.properties().keys() for u in users])
Tuttavia, il codice sopra i risultati in un errore:
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
Dopo alcuni esperimenti in debugger ho notato che l'aggiunta di un'espressione fittizio corregge il codice:
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])
Questo è abbastanza controintuitivo per me, perché la versione originale non funziona in Python 2.7? e perché l'aggiunta di un'espressione "inutile" nel mezzo risolve il problema?
Come da questa risposta http://stackoverflow.com/questions/8049798/understanding-nested-list-comprehension, l'associazione deve essere lasciata a destra e, quindi, riordinare le istruzioni del ciclo. – Ifthikhan