2010-11-01 10 views
5

El código siguiente no funciona, supongo que porque la gente del lugar() variable dentro de la comprensión se referirá al bloque anidado, donde se evalúa la comprensión:utilizando los locales() dentro de la comprensión diccionario

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

que podría utilizar globals() en su lugar, y parece funcionar, pero eso puede venir con algunos problemas adicionales (por ejemplo, si hubo una variable de un ámbito circundante que tiene el mismo nombre).

¿Hay algo que haga que el diccionario utilice las variables con precisión en el alcance de la función f?

Nota: Estoy haciendo esto porque tengo muchas variables que me gustaría poner en un diccionario más adelante, pero no quiero complicar el código escribiendo dict_['a'] en lugar de a mientras tanto.

Respuesta

4

tal vez podría hacer esto:

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

Sin embargo, yo no recomendamos el uso de locals() para este propósito.

+0

yo no pienso en esto! ¿Y por qué es malo usar lugareños() de esta manera? No estoy usando nada no documentado, ¿verdad? – max

+2

No está indocumentado, pero el uso de 'locals()' puede provocar que el compilador genere código menos que óptimo para la función a la que se hace referencia. Por ejemplo, si el compilador determina que puede optimizar el uso de alguna variable temporal (tal vez alguna * otra * variable en la función no relacionada con su diccionario), es posible que no pueda hacer eso si se usa 'locals()' dentro de la función. Además, al evitar crear un diccionario primero, se repite a sí mismo con (1) la asignación de cada variable, y (2) los nombres en la lista. –

+0

Entonces estoy atascado: http://stackoverflow.com/questions/4067463/alternative-to-locals-in-printing-a-table-with-a-header – max

1

Creo que tienes razón: el locals() dentro de la comprensión dict se referirá al espacio de nombres de la comprensión.

Una posible solución (si aún no lo ha ocurrido a usted):

f_locals = locals() 
dict_ = {x : f_locals[x] for x in list_} 
Cuestiones relacionadas