¿Usando variables globales entre archivos?
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 usar myList
en subfile.py
, de la siguiente manera
# ../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 nuevamente, no funcionó. ¿Cómo debo implementar esto? Entiendo que no puede funcionar así, cuando los dos archivos realmente no se conocen (bueno, el subarchivo no conoce el principal), pero no se me ocurre cómo hacerlo sin usar iowriting o pickle, que No quiero hacerlo.
El problema es que usted myList
lo definió main.py
, pero subfile.py
necesita usarlo. Aquí hay una manera limpia de resolver este problema: mueva todos los globales a un archivo, yo llamo a este archivo settings.py
. Este archivo es responsable de definir los globales e inicializarlos:
# settings.py
def init():
global myList
myList = []
A continuación, subfile
puedes importar globales:
# subfile.py
import settings
def stuff():
settings.myList.append('hey')
Tenga en cuenta que subfile
no llama init()
; esa tarea pertenece a main.py
:
# main.py
import settings
import subfile
settings.init() # Call only once
subfile.stuff() # Do stuff with global var
print settings.myList[0] # Check the result
De esta manera, logra su objetivo y evita inicializar variables globales más de una vez.
Consulte el documento de Python sobre cómo compartir variables globales entre módulos :
La forma canónica de compartir información entre módulos dentro de un solo programa es crear un módulo especial (a menudo llamado config o cfg).
config.py:
x = 0 # Default value of the 'x' configuration setting
Importe el módulo de configuración en todos los módulos de su aplicación; el módulo luego pasa a estar disponible como nombre global.
principal.py:
import config print (config.x)
En general, no utilice from modulename import * . Hacerlo satura el espacio de nombres del importador y hace que sea mucho más difícil para los linters detectar nombres indefinidos.
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.
En realidad, una variable global se define en un módulo __dict__
y se puede acceder a ella desde fuera de ese módulo como un atributo del módulo.
Entonces, en tu ejemplo:
# ../myproject/main.py
# Define global myList
# global myList - there is no "global" declaration at module level. Just inside
# function and methods
myList = []
# Imports
import subfile
# Do something
subfile.stuff()
print(myList[0])
Y:
# ../myproject/subfile.py
# Save "hey" into myList
def stuff():
# You have to make the module main available for the
# code here.
# Placing the import inside the function body will
# usually avoid import cycles -
# unless you happen to call this function from
# either main or subfile's body (i.e. not from inside a function or method)
import main
main.mylist.append("hey")
El uso from your_file import *
debería solucionar sus problemas. Define todo para que esté disponible globalmente (con la excepción de las variables locales en las importaciones, por supuesto).
Por ejemplo:
##test.py:
from pytest import *
print hello_world
y:
##pytest.py
hello_world="hello world!"
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 configurar el global dinámicamente, preste atención para importar los otros módulos después de configurar las variables globales, por ejemplo:
# settings.py
def init(arg):
global myList
myList = []
mylist.append(arg)
# subfile.py
import settings
def print():
settings.myList[0]
# main.py
import settings
settings.init("1st") # global init before used in other imported modules
# Or else they will be undefined
import subfile
subfile.print() # global usage