Python: carga las variables en un dict en el espacio de nombres

Quiero usar un grupo de variables locales definidas en una función, fuera de la función. Así que estoy pasando x=locals() en el valor de retorno.

¿Cómo puedo cargar todas las variables definidas en ese diccionario en el espacio de nombres fuera de la función, de modo que en lugar de acceder al valor usando x['variable'] , simplemente podría usar la variable ?

Considere la alternativa Bunch :

 class Bunch(object): def __init__(self, adict): self.__dict__.update(adict) 

así que si tiene un diccionario d y desea acceder (leer) sus valores con la syntax x.foo lugar del d['foo'] torpe d['foo'] , simplemente haga

 x = Bunch(d) 

esto funciona tanto dentro como fuera de las funciones, y es enormemente más limpio y seguro que inyectar d en globals() . Recuerda la última línea del zen de Python …

 >>> import this The Zen of Python, by Tim Peters ... Namespaces are one honking great idea -- let's do more of those! 

Este es un caso perfectamente válido para importar variables de un espacio local a otro espacio local, siempre y cuando uno esté consciente de lo que está haciendo. He visto muchas veces usar este código de maneras útiles. Solo hay que tener cuidado de no contaminar el espacio global común.

Puedes hacer lo siguiente:

 adict = { 'x' : 'I am x', 'y' : ' I am y' } locals().update(adict) blah(x) blah(y) 

En lugar de crear su propio objeto, puede usar argparse.Namespace :

 from argparse import Namespace ns = Namespace(**mydict) 

Para hacer lo inverso:

 mydict = vars(ns) 

La importación de variables en un espacio de nombres local es un problema válido y se utiliza a menudo en los marcos de plantillas.

Devuelve todas las variables locales de una función:

 return locals() 

Luego importa de la siguiente manera:

 r = fce() for key in r.keys(): exec(key + " = r['" + key + "']") 

Siempre hay esta opción, no sé si es el mejor método que existe, pero seguro que funciona. Asumiendo tipo (x) = dict

 for key, val in x.items(): # unpack the keys from the dictionary to individual variables exec (key + '=val') 

Se utiliza el siguiente fragmento de código (PY2) para hacer un espacio de nombres recursivo desde mis configuraciones de dict (yaml):

 class NameSpace(object): def __setattr__(self, key, value): raise AttributeError('Please don\'t modify config dict') def dump_to_namespace(ns, d): for k, v in d.iteritems(): if isinstance(v, dict): leaf_ns = NameSpace() ns.__dict__[k] = leaf_ns dump_to_namespace(leaf_ns, v) else: ns.__dict__[k] = v config = NameSpace() dump_to_namespace(config, config_dict)