2010-03-25 14 views
6

Tengo un paquete Python mymodule con un subpaquete utils (es decir, un subdirectorio que contiene módulos cada uno con una función). Las funciones tienen el mismo nombre que el archivo/módulo en el que viven.Importación de una función/clase de un módulo Python del mismo nombre

Me gustaría ser capaz de acceder a las funciones de la siguiente manera,

from mymodule.utils import a_function

embargo Curiosamente, a veces me puede importar funciones usando la notación anterior, sin embargo otras veces no puedo. Sin embargo, no he podido averiguar por qué (recientemente, por ejemplo, cambié el nombre de una función y el archivo en el que estaba y reflejé este cambio de nombre en el archivo utils.__init__.py pero ya no importé como funciones (más bien como un módulo) en una de mis guiones.

El utils.__init__.py lee algo así como,

__all__ = ['a_function', 'b_function' ...] 
from a_function import a_function 
from b_function import b_function 
... 

mymodule.__init__.py tiene ninguna referencia a utils

ideas?

Respuesta

7

¿sus utilidades funciones necesitan importar otras funciones utils? (o importar otros módulos que importan otras funciones de utils). Supongamos, por ejemplo, que a_function.py contiene "de mymodule.utils import b_function". Aquí está tu utils.py con un montón de comentarios adicionales:

# interpreter is executing utils.py 
# Right now, utils.a_function and utils.b_function are modules 

# The following line executes the a_function module, 
# then rebinds a_function to a_function.a_function 
from a_function import a_function 

# The following line executes the b_function module, 
# then rebinds b_function to b_function.b_function 
from b_function import b_function 

Cuando el módulo está a_function primera importado por utils.py, utils.b_function no es un módulo de función. Cualquier módulo que indique "desde mymodule.utils import b_function" antes de ejecutar la última línea terminará con una referencia al módulo b_function en lugar de a la función b_function.

En general, me parece que el idioma from somemodule import something está lleno de peligros para cualquier proyecto grande. Es ideal para scripts cortos, pero una vez que comienzas a introducir dependencias circulares de importación, te encuentras con problemas y debes tener cuidado con el lugar donde lo usas.

Como un compromiso entre la seguridad y el ahorro en tipeo, usaría from mymodule import utils y luego llamaría al utils.a_function(). De esta forma, siempre obtendrá el objeto vinculado al utils.a_functionen este momento en lugar de lo que sucedió que esté vinculado a utils.a_function durante la importación.

+0

¿Cuál es la diferencia entre 'import mymodule.utils as utils' y' from mymodule import utils'? –

+0

@Mike DeSimone: Buen punto. Actualicé mi respuesta en consecuencia. –

Cuestiones relacionadas