tutorial lenguaje instalar descargar python

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).