nombres metodos lista elementos diccionario dentro agregar python variables scope locals

lista - metodos diccionario python



Python: carga variables en un dict en el espacio de nombres (6)

Considera la alternativa de Bunch :

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

así que si tienes un diccionario d y quieres acceder (leer) sus valores con la sintaxis x.foo lugar de la d[''foo''] burda d[''foo''] , solo hazlo

x = Bunch(d)

esto funciona tanto dentro como fuera de 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!

Quiero usar un conjunto 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 .


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)


Este es un caso perfectamente válido para importar variables en un espacio local a otro espacio local, siempre que uno esté al tanto de lo que está haciendo. He visto ese código muchas veces siendo utilizado de manera útil. 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)


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

Devuelve todas las variables locales de una función:

return locals()

Luego importe 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, pero seguro que funciona. Asumiendo type (x) = dict

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


Usé el fragmento de código siguiente (PY2) para crear espacios de nombres recursivos a partir de mis configuraciones 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)