9

Sto provando a creare un dict con chiave come name e valore come corrispondente User oggetto.Problemi durante l'utilizzo della comprensione del Dict. NameError: nome globale non definito

Sto usando shell Python da Django shell wrapper python manage.py shell:

>>> from django.contrib.auth.models import User 
>>> names = ['carl', 'jim', 'jack', 'john', 'mark'] 
# Now using some dict comprehension 
>>> u = {name: User.objects.get(username=name) for name in names} 
NameError: global name 'User' is not defined 

Tuttavia, questo funziona per me:

u = {} 
for name in names: 
    u[name] = User.objects.get(username=name) 

E io ottenere il risultato desiderato, che è:

{ 
    'carl': <User: carl>, 
    'jack': <User: jack>, 
    'jim' : <User: jim>, 
    'john': <User: john>, 
    'mark': <User: mark> 
} 

Lo so, ci sono altri modi per farlo, ma sono curioso di sapere perché il testo è comprensibile gli ioni non funzionano qui.

Qualche consiglio?
Mi manca qualcosa qui?

+0

Non vedo alcun problema del genere, potrebbe mancare qualcosa! – Rohan

+0

Potrebbe essere che la chiusura del dizionario non ha accesso allo stesso spazio dei nomi della shell. 'U = Utente; u = {nome: U.objects.get (username = nome) per nome nei nomi} 'fai qualche differenza? (chiedendo solo se si tratta di un bug) – Dunes

+0

@Rohan, quali sono i passaggi che stai seguendo? @Dunes, no, questo non funziona, ottengo 'NameError: nome globale 'U' non è definito' –

risposta

2

Credo che python's issue tracer sia la migliore risposta per voi.

In breve: non funzionerà nella shell. Lo stesso vale per la definizione della funzione nella shell. Le importazioni non sono inaccessibili lì.

Per quanto riguarda per il vostro problema vi consiglio:

names = [...] 
users = User.objects.filter(username__in=names) 
name_to_user = {user.username: user for user in users} 

Fa una query SQL invece di len(names).

+0

Sì, so che è un modo per farlo, ma il mio problema non era l'ottimizzazione, ma la comprensione :-) –

+0

L'hai provato fuori dall'involucro allora? –

+0

Sì, quando eseguo 'python manage.py shell --plain' funziona! –

Problemi correlati