¿Usando variables globales entre archivos?

Resuelto asked hace 11 años • 10 respuestas

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.pyarchivo 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 myListen 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.pytení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.

 avatar Oct 23 '12 22:10
Aceptado

El problema es que usted myListlo definió main.py, pero subfile.pynecesita 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, subfilepuedes importar globales:

# subfile.py

import settings

def stuff():
    settings.myList.append('hey')

Tenga en cuenta que subfileno 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.

Hai Vu avatar Oct 23 '2012 16:10 Hai Vu

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.

Ogaga Uzoh avatar Aug 12 '2017 04:08 Ogaga Uzoh

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")
jsbueno avatar Oct 23 '2012 16:10 jsbueno

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!"
IT Ninja avatar Oct 23 '2012 15:10 IT Ninja

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
lastboy avatar Dec 23 '2015 09:12 lastboy