lenguaje - Variable global de un archivo diferente Python
python tutorial (6)
Así que tengo dos archivos diferentes como este:
file1.py
from file2 import *
foo = "bar";
test = SomeClass();
file2.py
class SomeClass :
def __init__ (self):
global foo;
print foo;
Sin embargo, parece que no consigo que el archivo 2 reconozca las variables del archivo 1, aunque ya se haya importado en el archivo 1. Sería extremadamente útil si esto fuera posible de alguna manera.
Cuando escribes
from file2 import *
en realidad copia los nombres definidos en file2
en el espacio de nombres de file1
. Entonces, si reasigna esos nombres en el file1
, escriba
foo = "bar"
por ejemplo, solo hará ese cambio en el file1
, no en el file2
. Tenga en cuenta que si tuviera que cambiar un atributo de foo
, digamos haciendo
foo.blah = "bar"
entonces ese cambio se reflejaría en el file2
, porque está modificando el objeto existente al que hace referencia el nombre foo
, y no lo reemplaza por un nuevo objeto.
Puede obtener el efecto que desea haciendo esto en file1.py
:
import file2
file2.foo = "bar"
test = SomeClass()
(tenga en cuenta que debe eliminar from foo import *
) aunque sugeriría que piense detenidamente si realmente necesita hacer esto. No es muy común que se justifique realmente cambiar las variables de un módulo desde otro módulo.
Importar file1.py
en file1.py
hace que los nombres globales (es decir, a nivel de módulo) enlazados en file2
estén disponibles para el siguiente código en file1
; el único nombre de este tipo es SomeClass
. No hace lo contrario: los nombres definidos en el file1
no están disponibles para el código en el file2
cuando el file1
importa el file2
. Este sería el caso incluso si importó de la manera correcta ( import file2
archivo import file2
, como @nate recomienda correctamente) en lugar de hacerlo de la manera horrible, horrible (si todo el mundo bajo el Sol olvidara la existencia del constructo) from ... import *
, la vida sería mucho mejor para todos).
Aparentemente, desea que los nombres globales definidos en file1
estén disponibles para el código en file2
y viceversa. Esto se conoce como "dependencia cíclica" y es una idea terrible (en Python, o en cualquier otro lugar).
Por lo tanto, en lugar de mostrarle los increíblemente frágiles, a menudo imposibles de alcanzar para lograr (una apariencia de) una dependencia cíclica en Python, preferiría discutir la excelente forma en que puede evitar una estructura tan terrible.
Por ejemplo, podría colocar nombres globales que deban estar disponibles para ambos módulos en un tercer módulo (por ejemplo, file3.py
, para continuar su racha de nombres ;-) e importar ese tercer módulo en cada uno de los otros dos ( import file3
en ambos file1
y file2
, y luego use file3.foo
, etc., es decir, nombres calificados , con el fin de acceder o configurar esos nombres globales desde uno o ambos de los otros módulos, no nombres de barras).
Por supuesto, se podría ofrecer más y más ayuda específica si aclaró (editando su Q) exactamente por qué cree que necesita una dependencia cíclica (solo una predicción fácil: no importa lo que le haga pensar que necesita una dependencia cíclica, usted es incorrecto;-).
Simplemente ponga sus globales en el archivo que está importando.
Todas las respuestas dadas son incorrectas. Es imposible globalizar una variable dentro de una función en un archivo separado.
from file2 import *
está haciendo copias. Quieres hacer esto:
import file2
print file2.foo
print file2.SomeClass()
global
es un nombre poco module_namespace
en Python, module_namespace
sería más descriptivo.
El nombre completo de foo
es file1.foo
y la declaración global se file1.foo
ya que generalmente hay mejores formas de lograr lo que quieres hacer. (No puedo decir lo que quieres hacer en tu ejemplo de juguete).