2012-05-08 9 views
40

Tengo dos situaciones específicas en las que no entiendo cómo la importación de obras en Python:¿Cómo funciona la importación de Python?

primera situación específica:

Cuando importo el mismo módulo en dos diferentes scripts de Python, el módulo no es importado dos veces, ¿verdad? La primera vez que Python lo encuentra, se importa y, por segunda vez, verifica si el módulo se ha importado o si realiza una copia.

segunda situación específica:

Considere el siguiente módulo, llamado bla.py:

a = 10 

Y luego, tenemos foo.py, un módulo que importa bla.py:

from bla import * 

def Stuff(): 
    return a 

Y después de eso, tenemos un script llamado bar.py, que es ejecutado por el usuario:

from foo import * 
Stuff() #This should return 10 
a = 5 
Stuff() 

Aquí no sé: ¿El retorno de 10 Stuff() o 5?

+12

¿Qué pasó cuando ejecutó el código? – geoffspear

+0

Puede encontrar estos interesantes: http://lucumr.pocoo.org/2011/9/21/python-import-blackbox/ y http://lucumr.pocoo.org/2009/7/24/singletons-and- sus-problemas-en-python /. Ambos tratan las importaciones en Python. – rubik

Respuesta

50

Parte 1

El módulo sólo se carga una vez, así que no hay pérdida de rendimiento mediante la importación de nuevo. Si realmente desea que se cargue/analice de nuevo, tendrá que reload() el módulo.

El primer lugar marcado es sys.modules, el caché de todos los módulos que se importaron anteriormente. [source]


Parte 2

from foo import * importaciones a al ámbito local. Al asignar un valor a a, se reemplaza con el nuevo valor, pero la variable original foo.a no se toca.

De modo que a menos que tenga import foo y modifique foo.a, ambas llamadas devolverán el mismo valor.

Para un tipo mutable como una lista o dict sería diferente, modificarlo afectaría de hecho la variable original, pero asignarle un nuevo valor aún no modificaría foo.whatever.

Si desea información más detallada, echar un vistazo a http://docs.python.org/reference/executionmodel.html:

Las siguientes construcciones se unen nombres: parámetros formales a las funciones, declaraciones de importación, definiciones de clases y funciones (éstas se unen a la clase o nombre de función en el bloque de definición) y objetivos que son identificadores si se producen en una asignación, para encabezado de bucle, en la segunda posición de un encabezado de cláusula de excepción o después como en una instrucción with.

Las dos secciones en negrita son los más relevantes para usted: En primer lugar el nombre a está unido al valor de foo.a durante la importación. Luego, al hacer a = 5, el nombre a está vinculado a 5. Como la modificación de una lista/dict no causa ningún enlace, esas operaciones modificarían la original (b y foo.b están vinculados al mismo objeto en el que opera). La asignación de un nuevo objeto al b sería una operación vinculante nuevamente y por lo tanto se separaría b del foo.b.

También vale la pena señalar qué es exactamente la import comunicado hace:

  • import foo se une el nombre del módulo al objeto de módulo en el ámbito actual, por lo que si modifica foo.whatever, que trabajará con el nombre en ese módulo - cualquier modificación/asignación afectará la variable en el módulo.
  • from foo import bar se une el nombre dado (s) solamente (es decir foo permanecerán no unido) con el elemento con el mismo nombre en foo - lo que las operaciones en bar se comportan como se explicó anteriormente.
  • from foo import * se comporta como el anterior, pero importa todos los nombres globales que no tienen el prefijo subrayado. Si el módulo define __all__, solo se importan los nombres dentro de esta secuencia.

Parte 3 (que ni siquiera existe en su pregunta: p)

La documentación de Python es extremadamente buena y por lo general detallado - contestar a encontrar en casi cada posible lengua relacionada pregunta allí. Aquí están algunos enlaces útiles:

2

Para responder a su primera pregunta:

No, Python no se 'importa' dos veces. Cuando python carga un módulo, busca el módulo en sys.modules. Si no está allí, se coloca allí y se carga.

para responder a su segunda pregunta:

módulos pueden definir qué nombres van a exportar a un escenario from camelot import *, y el comportamiento es crear nombres para los valores existentes, no para hacer referencia a las variables existentes (Python no tiene referencias)

En un tema algo relacionado, haciendo un from camelot import * es not the same as a regular import.

+0

Parece que ThiefMaster me ganó para responder a la edición. Dejo esto aquí solo para mantener el "' from camelot import * 'no es lo mismo que una importación normal." – Darthfett

Cuestiones relacionadas