variable modificar lista globales funciones ejemplos python share globals

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