2010-11-01 12 views
5

Il seguente codice non funziona, suppongo, perché la gente del posto() variabile all'interno la comprensione farà riferimento al blocco nidificato in cui viene valutata la comprensione:con gente del posto() all'interno di dizionario comprensione

def f(): 
    a = 1 
    b = 2 
    list_ = ['a', 'b'] 
    dict_ = {x : locals()[x] for x in list_} 

ho potuto utilizzare globals() invece, e sembra funzionare, ma che potrebbe venire con alcuni problemi aggiuntivi (ad esempio, se ci fosse una variabile da un ambito circostante che ha lo stesso nome).

C'è qualcosa che renderebbe il dizionario che utilizza le variabili esattamente nell'ambito della funzione f?

Nota: sto facendo questo perché ho molte variabili che mi piacerebbe mettere in un dizionario più tardi, ma non voglio complicare il codice scrivendo dict_['a'] invece a nel frattempo.

risposta

4

Si potrebbe forse fare questo:

def f(): 
    a = 1 
    b = 2 
    list_ = ['a', 'b'] 
    locals_ = locals() 
    dict_ = dict((x, locals_[x]) for x in list_) 

Tuttavia, vorrei fortemente scoraggiare l'uso di locals() per questo scopo.

+0

non ho pensato di questo! E perché è male usare i locali() come questo? Non sto usando nulla di non documentato, vero? – max

+2

Non è non documentato, ma l'uso di 'locals()' può far scattare il compilatore a generare codice meno che ottimale per la funzione a cui viene fatto riferimento. Ad esempio, se il compilatore determina che può ottimizzare l'uso di alcune variabili temporanee (forse alcune * altre * variabili nella funzione non correlate al tuo dizionario), potrebbe non essere in grado di farlo se viene utilizzato 'locals()' all'interno della funzione. Inoltre, evitando di creare un dizionario prima, ti stai ripetendo con (1) l'assegnazione di ogni variabile e (2) i nomi nell'elenco. –

+0

Quindi sono bloccato: http://stackoverflow.com/questions/4067463/alternative-to-locals-in-printing-a-table-with-a-header – max

1

Credo che tu abbia ragione: lo locals() all'interno della comprensione del dt farà riferimento allo spazio dei nomi della comprensione.

Una possibile soluzione (se non è già verificato a voi):

f_locals = locals() 
dict_ = {x : f_locals[x] for x in list_} 
Problemi correlati