2010-08-03 11 views
17

Así que tienen dos archivos diferentes algo como esto:variable global a partir de un archivo diferente Python

file1.py

from file2 import * 
foo = "bar"; 
test = SomeClass(); 

file2.py

class SomeClass : 
    def __init__ (self): 
     global foo; 
     print foo; 

Sin embargo, me parece que no puede conseguir archivo2 para reconocer variables del archivo1 aunque ya se haya importado al archivo1. Sería extremadamente útil si esto es posible de alguna manera.

+5

Por cierto, como principio general, no se recomienda hacer 'from module import *' porque dificulta ver de dónde proviene una variable importada. Además, no finalice sus declaraciones con punto y coma en Python. –

+0

También hace imposible que un linter detecte si está usando un identificador no definido – matiascelasco

Respuesta

32

Importación file2 en file1.py hace que los (es decir, nivel de módulo) nombres globales encuadernados en file2 disponibles a siguiente código en file1 - el único nombre es SomeClass. Hace no haga lo contrario: los nombres definidos en file1 no están disponibles para codificar en file2 cuando file1 importan file2.Este sería el caso incluso si importó de la manera correcta (import file2, como @nate recomienda correctamente) en lugar de hacerlo de la manera horrible y horrible que lo está haciendo (si todos bajo el Sol olvidaran la existencia del constructo from ... import *, vida Sería así que mucho mejor para todos).

parecer que quieren hacer nombres globales definidos en file1 disponible para el código en file2 y viceversa. Esto se conoce como una "dependencia cíclica" y es una idea terrible (en Python, o en cualquier otro lugar para el caso).

Así, en lugar de mostrar que las increíblemente frágiles, a menudo imposible de mantener los cortes para lograr (algo parecido a) una dependencia cíclica en Python, Prefiero discutir la excelente forma en que muchos en los que se puede evitar dicha estructura terribles .

Por ejemplo, usted podría poner nombres globales que deben estar a disposición de los dos módulos en un tercer módulo (por ejemplo file3.py, para continuar su racha de nombres ;-) e importación que el tercer módulo en cada uno de los otros dos (import file3 tanto en file1 y file2, y luego utilice file3.foo etc, es decir, nombres cualificados, con el fin de tener acceso o el establecimiento de esos nombres globales de uno o ambos de los otros módulos, no barenames).

Por supuesto, cada vez más específica ayuda se podrían ofrecer si clarificada (mediante la edición de su Q) exactamente qué cree que necesita una dependencia cíclica (sólo una predicción fácil: no importa lo que le hace pensar que necesita una dependencia cíclica, estás equivocado ;-).

+2

¿Puede 'file1.py' editar las variables globales en' file3.py', y 'file2.py' recargar automáticamente las nuevas variables globales? – LWZ

7

from file2 import * está haciendo copias. ¿Quieres hacer esto:

import file2 
print file2.foo 
print file2.SomeClass() 
3

global es un nombre poco apropiado en Python, module_namespace sería más descriptivo.

El nombre totalmente calificado de foo es file1.foo y la afirmación global es mejor evitarla ya que generalmente hay mejores formas de lograr lo que desea hacer. (No puedo decir lo que quiere hacer de su ejemplo de juguete.)

8

Cuando se escribe

from file2 import * 

en realidad copias los nombres definidos en file2 en el espacio de nombres de file1. Así que si reasigna los nombres de file1, escribiendo

foo = "bar" 

por ejemplo, que sólo hará que el cambio en file1, no file2. Tenga en cuenta que si tuviera que cambiar un atributo de foo, dicen haciendo

foo.blah = "bar" 

luego de que el cambio se reflejaría en file2, porque va a modificar el objeto existente que se refiere con el nombre foo, no reemplazándolo con un nuevo objeto

Usted puede obtener el efecto deseado al hacer esto en file1.py:

import file2 
file2.foo = "bar" 
test = SomeClass() 

(tenga en cuenta que debe eliminar from foo import *) aunque yo sugeriría pensar cuidadosamente acerca de si realmente se necesita para hacer esto. No es muy común que el hecho de cambiar las variables de un módulo desde otro módulo esté realmente justificado.

-1

Todas las respuestas dadas son incorrectas. Es imposible globalizar una variable dentro de una función en un archivo separado.

0

Simplemente ponga sus globales en el archivo que está importando.