PHP tiene una función llamada extract() que toma una matriz asociativa como argumento y crea variables locales de las claves cuyos valores están asignados a los valores de la clave. ¿Hay alguna manera de hacer esto en Python? Una búsqueda rápida en Google no me mostró de inmediato cómo. Sospecho que hay una forma con exec() pero sería bueno si hubiera alguna función para hacerlo por mí.¿Hay alguna forma de extraer un dict en Python en el espacio de nombres local?
Respuesta
Dado que es not safe modificar el dict que los locales() devuelve
>>> d={'a':6, 'b':"hello", 'c':set()}
>>> exec '\n'.join("%s=%r"%i for i in d.items())
>>> a
6
>>> b
'hello'
>>> c
set([])
Pero el uso ejecutivo de este tipo es feo. Debe rediseñar para que no necesite agregar dinámicamente a su espacio de nombres local
Editar: Consulte las reservas de Mike sobre el uso de repr en los comentarios.
>>> d={'a':6, 'b':"hello", 'c':set()}
>>> exec '\n'.join("%s=d['%s']"%(k,k) for k in d)
>>> id(d['c'])
3079176684L
>>> id(c)
3079176684L
Gracias, usaré esto.Mencioné anteriormente que NO NECESITO esta funcionalidad, solo creo que es bueno tenerla. – Kevin
Aunque no creo que nadie * realmente * necesite esta funcionalidad, una forma de rediseñar su código sería pasar el dict a una función con ** kwargs, donde el dict se desempaquetará limpiamente en el espacio de nombres local. –
Este código está roto. Si hicieras esto, harías referencia al dict en sí mismo, no extraerá los informes de los objetos, lo que no funciona en el caso general. Por ejemplo, creaste un nuevo conjunto en lugar de usar el pasado y si te hubiera pasado un tipo diferente, como uno que hice sin un 'repr' útil, estarías en el arroyo. –
Encontré un question similar que ha sido respondido en SO. La respuesta aceptada sugiere rodar su propio extracto equivalente para python.
Probar:
locals().update(my_dict)
EDIT:
gnibbler
ha hecho un punto muy válido que los locales no deben ser modificados (marque: http://docs.python.org/library/functions.html#locals). Aún así, Python Docs no dice que no es seguro, solo dice que los cambios en los locales pueden no afectar los valores de las variables. Antes de responder la pregunta que probé en mi IDLE 2.6 de Python, la actualización de locals realmente funciona, tanto en alcance global como dentro de una función. Es por eso que no borro mi respuesta, pero en su lugar agrego una advertencia que podría funcionar bajo ciertas circunstancias (¿específicas de la plataforma?), Pero no está garantizada.
No es seguro realizar modificaciones en 'locals()' http://docs.python.org/library/functions.html#locals –
No lo sé, ¿tiene algún vínculo que respalde esto? EDIT: encontré aquí que los locals() son de solo lectura, que no es el caso en el shell IDLE 2.6 ... –
No es sabio, pero es suficiente para un uso casual. –
locales Modificación() dict podría haber sido una solución, pero docs decir, http://docs.python.org/library/functions.html#
Nota El contenido de este diccionario no debe ser modificado; los cambios pueden no afectar los valores locales y variables gratuitas utilizadas por el intérprete .
así que la pregunta es ¿por qué incluso lo necesita? puede haber mejores formas de lograr eso sea lo que sea que intentes lograr.
¿Por qué no puedes acceder directamente a dict o asignarles variables?
- 1. Python: cargar variables en un dict en el espacio de nombres
- 2. ¿Hay alguna manera de establecer múltiples valores predeterminados en un dict de Python usando otro dict?
- 3. ¿Hay alguna forma de insertar un espacio en modo normal?
- 4. ¿Hay alguna forma de sobrecargar + = en python?
- 5. En WCF, ¿hay alguna forma de establecer el espacio de nombres de ServiceContract en todo el ensamblado?
- 6. ¿Hay alguna forma de que los dict literales de python se evalúen como dictados ordenados?
- 7. ¿Hay alguna forma de extraer recursos de cadenas en un proyecto de Android en IntelliJ IDE?
- 8. Cómo modificar el espacio de nombre local en python
- 9. ¿Hay alguna forma de extraer .NET 2.0 de .NET 3.5?
- 10. ¿Hay alguna forma de crear constantes de nivel de método sin contaminación del espacio de nombres?
- 11. ¿Hay alguna forma de extraer/actualizar todos los subrepos?
- 12. ¿Hay alguna forma de espacio de nombres de paquetes PL/SQL?
- 13. ¿Hay alguna forma mejor de extraer la hora del día?
- 14. ¿Hay alguna forma de acceder a una variable local en el ámbito externo en C++?
- 15. ¿Hay alguna forma de insertar un espacio de trabajo de MATLAB en una pila?
- 16. ¿Hay alguna manera de escapar del espacio de nombres raíz en VB?
- 17. ¿Hay alguna forma de obtener el recuento actual de ref de un objeto en Python?
- 18. ¿Hay alguna forma de mostrar el espacio de trabajo TFS actual en Visual Studio?
- 19. ¿Existe alguna forma clara de agregar funciones a un espacio de nombres creado dinámicamente?
- 20. ¿Hay alguna forma de cambiar el espacio entre los elementos de la leyenda en ggplot2?
- 21. Convirtiendo JSON en el dict de Python
- 22. Obtener locales del espacio de nombres de llamadas en Python
- 23. ¿Hay alguna descripción de cómo funciona __cmp__ para objetos dict en Python 2?
- 24. Python: El extracto de las variables de espacio de nombres
- 25. widget personalizado en un espacio de nombres
- 26. ¿Hay alguna forma de crear múltiples activadores en un script?
- 27. ¿Hay alguna forma de currying en C?
- 28. ¿Hay un atajo de espacio de nombres PHP para esto?
- 29. ¿Hay una forma estándar de enumerar los nombres de los módulos de Python en un paquete?
- 30. ¿Hay alguna forma de multirreproducir un SqlDataReader?
"Otro idioma puede hacerlo" rara vez es una buena razón para implementar una funcionalidad específica. –
Esta no es una característica "imprescindible" para mí, solo creo que es bastante ingeniosa para las funciones que toman ** kwargs. – Kevin
Si sabes estáticamente los nombres que estás recibiendo con kwargs y puedes escribirlos en el cuerpo de tu función, no estarías usando '** kwargs'. –