Cómo evitar variables globales.

Cuando leo documentación de python y varias listas de correo, siempre leo algo que parece un dogma. Las variables globales deben ser evitadas como el infierno, son de diseño pobre … OK, ¿por qué no? Pero hay una situación de la vida real en la que no sé cómo evitar ese patrón.

Digamos que tengo una GUI desde la que se pueden cargar varios archivos desde el menú principal. Los objetos de archivo correspondientes a los archivos cargados se pueden usar en toda la GUI (por ejemplo, un visor de imágenes que mostrará una imagen y en el que se pueden realizar varias acciones a través de diferentes diálogos / complementos).

¿Hay algo realmente malo en construir el siguiente diseño:

  • Menu.py -> el archivo se cargará desde aquí
  • Main.py -> los objetos de archivo cargados se pueden utilizar aquí
  • Dialog1.py -> o aquí
  • Dialog2.py -> o allí
  • Dialog3.py -> o allí
  • Globals.py

donde Globals.py almacenará un diccionario cuya clave son el nombre de los archivos cargados y el valor de los objetos de archivo correspondientes. Luego, desde allí, las diversas partes del código que necesitan esos datos accederían a él a través de referencias débiles.

Disculpe si mi pregunta parece (o es) estúpida, pero ¿ve alguna alternativa elegante o libre de todo el mundo? Una forma sería encapsular el diccionario de datos cargados en la clase de aplicación principal de Main.py, considerándolo como la parte de acceso central de la GUI. Sin embargo, eso también traería algunas complicaciones, ya que esta clase debería ser fácilmente accesible desde todos los diálogos que necesitan los datos, incluso si son necesariamente hijos directos de ellos.

muchas gracias por tu ayuda

Las variables globales deben evitarse porque inhiben la reutilización del código. Varios widgets / aplicaciones pueden vivir agradablemente dentro del mismo bucle principal. Esto le permite abstraer lo que ahora piensa como una sola GUI en una biblioteca que crea dicha GUI a pedido, de modo que (por ejemplo) un solo lanzador puede iniciar múltiples GUI de nivel superior que comparten el mismo proceso.

Si utiliza variables globales, esto es imposible porque varias instancias de GUI superarán el estado de cada una.

La alternativa a las variables globales es asociar los atributos necesarios con un widget de nivel superior y crear sub-widgets que apunten a los mismos widgets de nivel superior. Luego, por ejemplo, una acción de menú usará su widget de nivel superior para alcanzar el archivo abierto actualmente para operar en él.

Manejaría los datos globales encapsulando los datos en una o más clases e implementando el patrón de Borg para estas clases. Vea Por qué el patrón Borg es mejor que el patrón Singleton en Python