2011-05-15 8 views
7

Tengo 2 archivos main.py e irc.py.
main.pyPython: ¿Cómo puedo usar la variable del archivo principal en el módulo?

import irc 
var = 1 
func() 

irc.py

def func(): 
    print var 

Cuando trato de ejecutar main.py estoy recibiendo este error

NameError: global name 'var' is not defined

Cómo hacer que funcione?

@Edit
pensé que hay una mejor solución, pero por desgracia el único que he encontrado es hacer otro archivo e importarlo a ambos archivos
main.py

import irc 
import another 
another.var = 1 
irc.func() 

irc.py

import another 
def func(): 
    print another.var 

another.py

var = 0 

Respuesta

10

No. Pásalo. Intenta mantener el código lo más desacoplado posible: un módulo no debe depender del funcionamiento interno del otro. En cambio, intente y exponga lo menos posible. De esta manera, te protegerás de tener que cambiar el mundo cada vez que quieras que las cosas se comporten de manera diferente.

main.py

import irc 
var = 1 
func(var) 

irc.py

def func(var): 
    print var 
+0

Sería más fácil para mí de seguir esta función para archivo principal en lugar de añadir este argumento – gr56

+0

@ GR56: Entonces suena como refactorización está en orden. Si eso tampoco es posible, elegiría un tercer módulo que contenga solo el objeto 'var' y ambos lo importen. Si eso funciona para usted, publíquelo como respuesta a su propia pregunta y acéptelo. –

+0

@SamirTalwar Puede hacer esto para funciones, ¿qué tal para crear instancias de clases? Por ejemplo, desea definir instancias de una clase en otro módulo que puede importar. Los argumentos no pueden ser marcadores de posición en este caso. –

0

Bueno, var en la función no se declara. Podrías pasarlo como argumento. main.py

import irc 
var = 1 
func(var) 

irc.py

def func(str): 
    print str 
1

dos opciones.

from main import var 

def func(): 
    print var 

Esto copiará una referencia al nombre original del módulo de importación.

import main 

def func(): 
    print main.var 

Esto le permitirá usar la variable del otro módulo y le permitirá cambiarla si lo desea.

+0

Oh, esto está simplemente mal. Las importaciones mutuas me dan los jeebies heebie. –

+0

Entonces simplemente no sabes lo que estás haciendo. Las importaciones mutuas son perfectamente seguras y funcionan bien si se dan ciertas restricciones muy claras. –

+0

@Ignacio: Y funcionarán bien en este código de juguete diseñado para resaltar el problema. Tengo dudas de que funcionen como se espera en la realidad. Incluso si lo hacen, alentarán líneas difusas entre los módulos que solo sirven para agregar funciones nuevas y mantener las antiguas mucho más difíciles de lo que deben ser. No puedo imaginar una situación en la que las importaciones mutuas funcionen mejor que un tercer módulo que sirva a las dos originales. –

5

Bueno, esa es mi código que funciona bien:

func.py:

import __main__ 
def func(): 
    print(__main__.var) 

principal.PY:

from func import func 

var="It works!" 
func() 
var="Now it changes!" 
func() 
+0

Me gusta esta solución y funciona ... pero eclipse me da un 'Indefinido' variable de importación: error var 'en cualquier variable importada o función de main. ¿Alguna forma de evitar esto? – user4061565

+0

ver [how-do-i-fix-pydev-undefined-variable-from-import-errors] (https://stackoverflow.com/questions/2112715/how-do-i-fix-pydev-undefined-variable- errores de importación-importación) – user4061565

Cuestiones relacionadas