¿Es una buena idea crear dinámicamente variables?

Recientemente descubrí cómo crear dinámicamente variables en python a través de este método:

vars()['my_variable'] = 'Some Value' 

Así creando la variable my_variable .

Mi pregunta es, ¿es esta una buena idea? ¿O debería declarar siempre las variables antes de tiempo?

Creo que es preferible usar un diccionario si es posible:

 vars_dict = {} vars_dict["my_variable"] = 'Some Value' vars_dict["my_variable2"] = 'Some Value' 

Creo que es más python.

Esta es una mala idea, ya que es mucho más difícil analizar el código, tanto para un ser humano que busca en la fuente, como para herramientas como pylint o pychecker. Será mucho más probable que introduzcas errores si usas trucos como esos. Si cree que necesita esa función en algún momento, piense realmente si puede resolver su problema de una manera más simple y convencional. He usado Python durante casi 20 años y nunca sentí la necesidad de hacerlo.

Si tiene necesidades más dinámicas, solo use un diccionario normal, o posiblemente algo como json.

Una de las grandes cosas de Python, su naturaleza dinámica y los buenos tipos de colección estándar, es que puede evitar poner lógica en las cadenas de texto. Tanto el intérprete de Python, el resaltado de syntax en su IDE, el conocimiento inteligente y las herramientas de análisis de código miran su código fuente, proporcionan sugerencias útiles y encuentran errores y debilidades. Esto no funciona si su estructura de datos o lógica se ha ocultado en cadenas de texto.

Los lenguajes más estúpidos y rígidos, como C ++ y Java, a menudo hacen que los desarrolladores recurran a estructuras de datos basadas en cadenas como XML o json, ya que no tienen colecciones convenientes como listas o dictados de Python. Esto significa que oculta la lógica empresarial del comstackdor y otras comprobaciones de seguridad integradas en el lenguaje o las herramientas, y tiene que realizar muchas comprobaciones que las herramientas de desarrollo harían por usted. En Python no tienes que hacer eso … ¡así que no lo hagas!

Pros:

  • Añade otro nivel de direccionamiento indirecto, hace que el ambiente sea más dynamic.
    • En particular, permite evitar más duplicación de código.

Contras:

  • no aplicable para espacios de nombres de funciones (debido a la optimización)
  • Añade otro nivel de direccionamiento indirecto, hace que el ambiente sea más dynamic.
    • Las “referencias léxicas” son mucho más difíciles de rastrear y mantener.
      • Si los nombres creados son arbitrarios, los conflictos están esperando a suceder.
      • Es difícil encontrar los entresijos en el código base y predecir su comportamiento.
      • Es por eso que estos trucos pueden alterar las herramientas de verificación de código como pylint
  • Si las variables se procesan de una manera similar, probablemente pertenezcan juntas por separado de otras (en un dict dedicado) en lugar de reutilizar un dict de espacio de nombres, lo que hace que sea un desastre en el proceso.

En resumen, a nivel de abstracción las funciones de Python en lenguaje y tiempo de ejecución están diseñadas, solo es bueno en cantidades pequeñas y bien definidas.

No hay garantía de que vars()['myvariable'] = 'Some value' y my variable = 'Some value' tengan el mismo efecto. De la documentación :

Sin un argumento, vars () actúa como locals (). Tenga en cuenta que el diccionario local solo es útil para las lecturas, ya que las actualizaciones del diccionario local se ignoran.

Este código es simplemente incorrecto.

No veo cuál sería la ventaja de esto, también haría que su código sea más difícil de entender. Así que no, no creo que sea una buena idea.