Creación o asignación de variables desde un diccionario en Python

Intenté hacer una pregunta normalmente una vez aquí, pero nadie entiende lo que quiero preguntar. Así que he encontrado ejemplo en PHP.

// $_POST = array('address' => '123', 'name' => 'John Doe'); extract($_POST); echo $address; echo $name 

¿Hay una función como extract () en PYTHON ?????

Lo mismo ocurre con el diccionario:

 mydict = {'raw':'data', 'code': 500} // some magic to extract raw and code as vars print raw 

ps, por qué quiero hacer esto: cuando estás en el método de clase, es muy difícil tener 6 manipulaciones con cadenas en join () y format () cuando string es self.data [‘raw’] [‘code’] ( asume que es dict en dict aquí

Puede usar la función locals () para acceder a la tabla de símbolos locales y actualizar esa tabla:

 >>> mydict = {'raw': 'data', 'code': 500} >>> locals().update(mydict) >>> raw 'data' >>> code 500 

Sin embargo, modificar la tabla de símbolos de esa manera es bastante inusual, y probablemente no sea el camino a seguir. Tal vez necesite cambiar su diseño para poder usar el diccionario mydict lugar de las variables reales.

Horriblemente tarde para el juego, pero necesitaba exactamente esto, y mi solución fue:

 mydict = {'raw':'data', 'code': 500} raw, code = [mydict.get(k) for k in ['raw','code']] 

De esa manera, es explícito para la lectura y no hay posibilidades de obstruir a los locales () (que es una magia que preferiría evitar).

OK php hermanos, así que aquí hay una mala noticia, python no puede crear variables desde fuera del espacio … como php can: $ {$ var}. Usar local () es una muy mala idea, porque tendrás muchos problemas con la depuración, y hay algunos locales ya definidos allí … así que es algo muy malo que hacer …

No puedes crear esto programáticamente como lo hace php. Creo que se llama no explícito, y este es un general de Python: SIEMPRE sabes el nombre de la variable. Este tipo de cosas solo es un suicidio en algunos casos, necesita escribir a mano toneladas de variables … En general, no estaba contento debido a cosas como el análisis de XML, pero parece que hay un método para convertir el diccionario de Python en clase. Me dijeron esto ayer pero todavía no he comprobado cómo funciona (algo como aquí )

Recomiendo crear una clase para contener las variables que estás tratando de crear. La famosa receta del manojo de Alex Martelli le brindará casi toda la comodidad que está solicitando, sin recurrir a modificar la tabla de símbolos local (que los documentos advierten específicamente en contra de hacer).

Nada realmente nuevo aquí, solo una consolidación de una respuesta y una ilustración de lo que @John Y quiso decir en su respuesta :

 mydict = {'raw': 'data', 'code': 500} def extract(dct, namespace=None): if not namespace: namespace = globals() namespace.update(dct) extract(mydict) print raw print code class Extract: def __init__(self, dct): self.__dict__.update(dct) obj = Extract(mydict) print obj.raw print obj.code 

También puede utilizar la palabra clave exec en un bucle.

 d = dict(param='hello', param2=500, param3=[1,2,3]) for k, v in d.iteritems(): exec '%s = v' % k 

Pero esto ciertamente se siente antipónico. exec siente un poco esotérico y probablemente debería reestructurar su código para no tener que hacer esto.

Intenté la respuesta de @ Frédéric Hamidi y descubrí que locals () solo funciona en el script principal y NO en ninguna función. Así que hice un poco de búsqueda y descubrí que los locales () solo se LEEN. La razón por la que funciona en el script principal es probablemente porque locals () es el mismo que globals (), y globals () se pueden modificar.

Así que sugeriría usar globals (). Update () en su lugar.

Pero va a contaminar su espacio de nombres global. Así que este truco es incluso menos limpio que los locales ().