¿Cómo realizo variables variables en Python?
Aquí hay una entrada manual elaborada, por ejemplo: Variables variables
Sin embargo, he escuchado que esta es una mala idea en general, y es un agujero de seguridad en Python. ¿Es eso cierto?
python
variable-variables
Taryn
fuente
fuente
Respuestas:
Puede usar diccionarios para lograr esto. Los diccionarios son almacenes de claves y valores.
Puede usar nombres clave variables para lograr el efecto de variables variables sin el riesgo de seguridad.
Para casos en los que estás pensando en hacer algo como
una lista puede ser más apropiada que un dict. Una lista representa una secuencia ordenada de objetos, con índices enteros:
Para secuencias ordenadas, listas son más convenientes que predice con claves enteras, porque las listas apoyan iteración con el fin índice, rebanar ,
append
y otras operaciones que requiera la gestión de claves torpe con un diccionario.fuente
Use la
getattr
función incorporada para obtener un atributo en un objeto por su nombre. Modifique el nombre según sea necesario.fuente
No es una buena idea. Si está accediendo a una variable global que puede usar
globals()
.Si desea acceder a una variable en el ámbito local, puede usarla
locals()
, pero no puede asignar valores al dict devuelto.Una mejor solución es usar
getattr
o almacenar sus variables en un diccionario y luego acceder a ellas por su nombre.fuente
x = "foo"
ylocals()["x"] = "bar"
usandoprint x
da la salidabar
para Jython 2.5.2. Esto se probó con un script de automatización bajo demanda en maximo .Siempre que quiera usar variables variables, probablemente sea mejor usar un diccionario. Entonces en lugar de escribir
usted escribe
De esta forma, no sobrescribirá accidentalmente variables previamente existentes (que es el aspecto de seguridad) y puede tener diferentes "espacios de nombres".
fuente
Los nuevos codificadores a veces escriben código como este:
Luego, el codificador se queda con un montón de variables con nombre, con un esfuerzo de codificación de O ( m * n ), donde m es el número de variables con nombre yn es el número de veces que se necesita acceder a ese grupo de variables (incluida la creación ) El principiante más astuto observa que la única diferencia en cada una de esas líneas es un número que cambia según una regla, y decide usar un bucle. Sin embargo, se atascan en cómo crear dinámicamente esos nombres de variables y pueden intentar algo como esto:
Pronto descubren que esto no funciona.
Si el programa requiere "nombres" de variables arbitrarias, un diccionario es la mejor opción, como se explica en otras respuestas. Sin embargo, si simplemente está tratando de crear muchas variables y no le importa referirse a ellas con una secuencia de enteros, probablemente esté buscando un
list
. Esto es particularmente cierto si sus datos son homogéneos, como lecturas diarias de temperatura, puntajes de cuestionarios semanales o una cuadrícula de widgets gráficos.Esto se puede ensamblar de la siguiente manera:
Esto
list
también se puede crear en una línea con una comprensión:El resultado en cualquier caso es una población
list
, con el primer elemento al que se accedemy_calculator.buttons[0]
, el siguiente conmy_calculator.buttons[1]
, y así sucesivamente. El nombre de la variable "base" se convierte en el nombre dellist
identificador variable y se utiliza para acceder a él.Finalmente, no olvide otras estructuras de datos, como el
set
- esto es similar a un diccionario, excepto que cada "nombre" no tiene un valor adjunto. Si simplemente necesita una "bolsa" de objetos, esta puede ser una excelente opción. En lugar de algo como esto:Tendrás esto:
Use a
list
para una secuencia de objetos similares, aset
para una bolsa de objetos ordenada arbitrariamente odict
para una bolsa de nombres con valores asociados.fuente
En lugar de un diccionario, también puedes usar
namedtuple
desde el módulo de colecciones, lo que facilita el acceso.Por ejemplo:
fuente
Si no desea usar ningún objeto, aún puede usarlo
setattr()
dentro de su módulo actual:fuente
__dict__
variables. Me pregunto si existe un mecanismo general para crear dinámicamente cualquier variable global.globals()
puede hacer estoLa
SimpleNamespace
clase podría usarse para crear nuevos atributos consetattr
o subclaseSimpleNamespace
y crear su propia función para agregar nuevos nombres de atributos (variables).fuente
Estoy respondiendo la pregunta: ¿Cómo obtener el valor de una variable dado su nombre en una cadena? que se cierra como un duplicado con un enlace a esta pregunta.
Si las variables en cuestión son parte de un objeto (parte de una clase, por ejemplo), entonces algunas funciones útiles para lograr exactamente eso son
hasattr
,getattr
ysetattr
.Entonces, por ejemplo, puedes tener:
Entonces puedes hacer:
fuente
Utilizar
globals()
En realidad, puede asignar variables al ámbito global de forma dinámica, por ejemplo, si desea 10 variables a las que se puede acceder en un ámbito global
i_1
,i_2
...i_10
:Esto asignará 'a' a todas estas 10 variables, por supuesto, también puede cambiar el valor dinámicamente. Ahora se puede acceder a todas estas variables como cualquier otra variable declarada globalmente:
fuente
Debe usar el
globals()
método integrado para lograr ese comportamiento:fuente
El consenso es usar un diccionario para esto; vea las otras respuestas. Esta es una buena idea para la mayoría de los casos, sin embargo, hay muchos aspectos que surgen de esto:
Dicho esto, he implementado un administrador de variables variables -clase que proporciona algunas de las ideas anteriores. Funciona para python 2 y 3.
Usarías la clase así:
Si desea permitir la sobrescritura de variables con el mismo tipo solamente:
fuente
He intentado ambos en Python 3.7.3, puedes usar globals () o vars ()
Referencia:
https://www.daniweb.com/programming/software-development/threads/111526/setting-a-string-as-a-variable-name#post548936
fuente
Cualquier conjunto de variables también se puede agrupar en una clase. Las variables "variables" se pueden agregar a la instancia de clase durante el tiempo de ejecución accediendo directamente al diccionario integrado a través del atributo __dict__.
El siguiente código define la clase Variables, que agrega variables (en este caso, atributos) a su instancia durante la construcción. Los nombres de las variables se toman de una lista específica (que, por ejemplo, podría haber sido generada por el código del programa):
fuente