[Python-es] Imports cíclicos

Xin xinxic en gmail.com
Mie Ene 16 17:09:58 CET 2008


Hola,

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):
   File "<stdin>", line 1, in <module>
   File "pckg/__init__.py", line 1, in <module>
     import p1
   File "pckg/p1/__init__.py", line 1, in <module>
     from m import *
   File "/Users/Xin/Documents/Projectes/Python/import_ciclic/pckg/p1/ 
m.py", line 1, in <module>
     from pckg import p2
   File "/Users/Xin/Documents/Projectes/Python/import_ciclic/pckg/p2/ 
__init__.py", line 1, in <module>
     from m import *
   File "/Users/Xin/Documents/Projectes/Python/import_ciclic/pckg/p2/ 
m.py", line 1, in <module>
     from pckg import p2
ImportError: cannot import name p2

La solución que adopté fué poner el import del segundo caso dentro de  
las classes que los necessitavan, así no se importaban hasta que se  
necessitaban y no habia problema de import cíclicos.

Vosotros os habeis encontrado con estos problemas? Como los habeis  
solucionado?



Mirando más profundamente i usando módulos me encuentro que el  
problema solo se produce cuando se hacen imports con "from ???  
import ???"

Estos dos ejemplos fallan.
	pckg/
		__init__.py		(import m1; import m2)
		m1.py			(from pckg import m2)
		m2.py			(from pckg import m1)

	pckg/
		__init__.py		(import m1; import m2)
		m1.py			(from . import m2)
		m2.py			(from . import m1)


En cambio estos import directos no fallan:
	pckg/
		__init__.py		(import m1; import m2)
		m1.py			(import m2)
		m2.py			(import m1)

	pckg/
		__init__.py		(import m1; import m2)
		m1.py			(import pckg.m2)
		m2.py			(import pckg.m1)


Hay un caso especial que produce un error AttributeError:
	pckg/
		__init__.py		(import m1; import m2)
		m1.py			(import pckg.m2 as m2_)
		m2.py			(import pckg.m1as m1_)

Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
   File "/Users/Xin/Documents/Projectes/Python/import_ciclic/pckg/ 
__init__.py", line 1, in <module>
     import m1
   File "/Users/Xin/Documents/Projectes/Python/import_ciclic/pckg/ 
m1.py", line 1, in <module>
     import pckg.m2 as m3
   File "/Users/Xin/Documents/Projectes/Python/import_ciclic/pckg/ 
m2.py", line 1, in <module>
     import pckg.m1 as m4
AttributeError: 'module' object has no attribute 'm1'



Algun comentario al respecto ?

Xin


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