Estoy un poco confundido acerca de cómo funcionan las variables globales. Tengo un proyecto grande, con alrededor de 50 archivos, y necesito definir variables globales para todos esos archivos.
Lo que hice fue definirlos en mi main.py
archivo de proyectos , de la siguiente manera:
# ../myproject/main.py
# Define global myList
global myList
myList = []
# Imports
import subfile
# Do something
subfile.stuff()
print(myList[0])
Estoy tratando de utilizar myList
en subfile.py
, la siguiente
# ../myproject/subfile.py
# Save "hey" into myList
def stuff():
globals()["myList"].append("hey")
Otra forma lo intenté, pero tampoco funcionó
# ../myproject/main.py
# Import globfile
import globfile
# Save myList into globfile
globfile.myList = []
# Import subfile
import subfile
# Do something
subfile.stuff()
print(globfile.myList[0])
Y dentro subfile.py
tenía esto:
# ../myproject/subfile.py
# Import globfile
import globfile
# Save "hey" into myList
def stuff():
globfile.myList.append("hey")
Pero de nuevo, no funcionó. ¿Cómo debo implementar esto? Entiendo que no puede funcionar así, cuando los dos archivos no se conocen realmente (bueno, el subfile no conoce main), pero no puedo pensar en cómo hacerlo, sin usar io writing o pickle, que No quiero hacer
NameError: name 'myList' is not defined
desdemain.py
líneaprint(globfile.myList[0])
Respuestas:
El problema se define
myList
desdemain.py
, perosubfile.py
necesita usarlo. Aquí hay una manera limpia de resolver este problema: mover todos los globales a un archivo, yo llamo a este archivosettings.py
. Este archivo es responsable de definir los globales e inicializarlos:A continuación,
subfile
puede importar globales:Tenga en cuenta que
subfile
no se llamainit()
, esa tarea pertenece amain.py
:De esta manera, logra su objetivo mientras evita inicializar variables globales más de una vez.
fuente
init()
. Los módulos solo se evalúan la primera vez que se importan, por lo que está perfectamente bien inicializar esas variables en el cuerpo del módulo.Consulte el documento de Python sobre cómo compartir variables globales entre módulos :
fuente
x
usandofrom config import x
, solo usandoimport config
Puede pensar en las variables globales de Python como variables de "módulo" y, como tales, son mucho más útiles que las "variables globales" tradicionales de C.
Una variable global se define realmente en un módulo
__dict__
y se puede acceder desde fuera de ese módulo como un atributo del módulo.Entonces, en tu ejemplo:
Y:
fuente
Usar
from your_file import *
debería solucionar tus problemas. Define todo para que esté disponible globalmente (con la excepción de las variables locales en las importaciones, por supuesto).por ejemplo:
y:
fuente
import *
a toda costa para que las referencias sean explícitas (y no confusas). Además, ¿cuándo alguna vez ha usado todas las "*
" referencias en algún módulo?La respuesta de Hai Vu funciona muy bien, solo un comentario:
En caso de que esté utilizando el global en otro módulo y desee establecer el global dinámicamente, preste atención para importar los otros módulos después de configurar las variables globales, por ejemplo:
fuente
Su segundo intento funcionará perfectamente, y en realidad es una muy buena manera de manejar nombres de variables que desea tener disponibles globalmente. Pero tienes un error de nombre en la última línea. Así es como debería ser:
¿Ves la última línea? myList es un atributo de globfile, no subfile. Esto funcionará como quieras.
Miguel
fuente