lista - modificar variable global python
¿Usando variables globales entre archivos? (6)
Consulte el documento de Python sobre docs.python.org/2/faq/… :
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 queda disponible como un nombre global.
main.py:
import config print config.x
o
from config import x print x
En general, no use desde el nombre de módulo import * . Al hacerlo, se satura el espacio de nombres del importador, y hace que sea mucho más difícil para los linters detectar nombres indefinidos.
Estoy un poco confundido sobre cómo funcionan las variables globales. Tengo un gran proyecto, con alrededor de 50 archivos, y necesito definir variables globales para todos esos archivos.
Lo que hice fue definirlos en el archivo main.py
mis proyectos, de la siguiente manera:
# ../myproject/main.py
# Define global myList
global myList
myList = []
# Imports
import subfile
# Do something
subfile.stuff()
print(myList[0])
subfile.py
usar myList
en subfile.py
, como sigue
# ../myproject/subfile.py
# Save "hey" into myList
def stuff():
globals()["myList"].append("hey")
De otra manera 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 de subfile.py
tuve 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 (el subarchivo no lo conoce como principal), pero no puedo pensar en cómo hacerlo, sin usar io writing o pickle, que No quiero hacer
El problema es que definiste myList
desde main.py, pero subfile.py necesita usarlo. Aquí hay una forma limpia de resolver este problema: mover todos los globales a un archivo, llamo a este archivo settings.py
. Este archivo es responsable de definir globales e inicializarlos:
# settings.py
def init():
global myList
myList = []
A continuación, su subarchivo puede importar globales:
# subfile.py
import settings
def stuff():
settings.myList.append(''hey'')
Tenga en cuenta que el subarchivo no llama a 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 forma, logras tu objetivo mientras evitas inicializar variables globales más de una vez.
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 establecer el global de forma dinámica, preste atención para importar los otros módulos después de establecer 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
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 en realidad se define en el __dict__
un módulo y se puede acceder desde fuera de ese módulo como un atributo de 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")
Su segundo intento funcionará perfectamente, y en realidad es una muy buena forma de manejar nombres de variables que desea que estén disponibles globalmente. Pero tienes un error de nombre en la última línea. Así es como debería ser:
# ../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])
Ver la ultima linea? myList es un attr de globfile, no subarchivo. Esto funcionará como quieras.
Micro