Re: Imports cíclicos

Chema Cortes pych3m4 en gmail.com
Jue Ene 17 10:32:38 CET 2008


El 16/01/08, Xin <xinxic en gmail.com> escribió:

> Ahora estaba leyendo el hilo sobre heréncia múltiple i me he acordado
> de un problema que tuve con imports cíclicos.
>
> Esta és la jerarquia i los imports
>         pckg/
>                 __init__.py             (import p1; import p2)
>                 p1/
>                         __init__.py             (from m import *)
>                         m.py                    (from pckg import p2)
>                 p2/
>                         __init__.py             (from m import *)
>                         m.py                    (from pckg import p1)
>
> Esto provoca esta excepción:
>  >>> import pckg
> Traceback (most recent call last):
>...

> Algun comentario al respecto ?

No puedo en este momento en entretenerme en revisar todo el mensaje,
así que confío en que mi respuesta te pueda servir. Siempre puedes
acudir a la fuente original, que es un viejo artículo de Guido:

http://www.python.org/doc/essays/packages.html

Supongo que sabrás que hay un mecanismo de optimización a la hora de
importar módulos. Si el módulo a importar figura en sys.modules como
importado, usa la referencia en sys.modules en lugar de repetir todo
el proceso de importación.

Pues bien, durante la importación de un paquete se añade un "señuelo"
en sys.modules para evitar su reimportación. Este señuelo no es más
que un módulo vacío, que se irá completando hasta llegar al final de
la importación. Durante este proceso, cualquier acceso al módulo dará
resultados imprevistos, casi siempre por no poder acceder a algún
submódulo.

El porqué falla con from..import.. y no con import a secas lo tienes
que pensar desde el punto de vista que el import se limita a añadir un
señuelo para completarlo después, mientras que el from..import..
accede a la estructura del paquete.

Recuerdo que en un mensaje a esta lista explicaba un poco el tema de
los señuelos, pero no lo encuentro. Tal vez fuera este mensaje:

http://listas.aditel.org/archivos/python-es/2003-December/003686.html

En mensaje que no encuentro era más reciente e iba sobre cómo importar
clases que se referenciaban entre sí.
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





Más información sobre la lista de distribución Python-es