2011-09-21 9 views
5

Antes que nada, mis disculpas si ya se ha formulado esta pregunta en otro lugar. Realmente lo busqué, pero no encontré nada.Módulo principal de importación de módulos

La situación es la siguiente: En una carpeta mod, tengo los archivos __init__.py y sub.py. contienen los siguientes datos: __init__.py:

print "mod" 

sub.py:

import __init__ 
print "sub" 

Ahora vamos a hacer lo siguiente:

>>> import mod 
mod 
>>> import mod.sub 
mod 
sub 

Pero cuando se hace import mod.sub, ¿por qué se mod/__init__.py ejecuta de nuevo? Ya había sido importado. La misma característica extraña existe si nos llamamos:

>>> import mod.sub 
mod 
mod 
sub 

¿Puedo cambiar el comportamiento cambiando la import __init__? Esta es la línea que parece más probable para mí.

+0

¿Por qué dices "importar __init__" en sub.py ?? – rocksportrocker

+0

Porque el módulo primario 'mod' contiene clases compartidas que están subclasificadas en' sub'. – Turion

Respuesta

1

se debe reemplazar

import __init__ 

por

import mod 
+0

Me parece contra-intuitivo que esto funcione. Después de todo, ya estamos en la carpeta 'mod' y habría pensado que el intérprete buscaría un archivo' mod.py'. – Turion

7

En realidad se puede inspeccionar lo que está pasando por el uso del diccionario sys.modules. Python decide volver a cargar un módulo según las claves de ese diccionario.

Cuando ejecuta import mod, crea una entrada, mod en sys.modules.

Cuando se ejecuta import mod.sub, después de la llamada a import __init__, Python comprueba si la clave está en mod.__init__sys.modules, pero no hay tal clave, por lo que se importa de nuevo.

La conclusión es que Python decide volver a importar un módulo mediante claves presentes en sys.modules, no porque el módulo real ya se haya importado.

+0

Buena explicación, gracias. – Turion

0

Para completar, he encontrado otra solución a jugar con las importaciones en relación:

Reemplazar

import __init__ 

por

from . import __init__ 

Pero no entiendo por qué esto funciona.

editar: Esto en realidad no funciona. el resultado __init__ no es el módulo mod, sino algo más del tipo method-wrapper. Ahora estoy totalmente confundido.

Cuestiones relacionadas