[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