[pyar] Importación circular en Python 3

Julio César Gázquez julio_lists en mebamutual.com.ar
Mie Mayo 8 09:49:03 ART 2013


Buenas gente.

Recurro a ustedes porque tengo un problema que aunque se supone trivial 
me tiene complicado.

Tengo un desarrollo en el cual tengo dos módulos que por cuestiones de 
orden quiero mantener separados, pero que estando separados necesito que 
se referencian mutuamente (para establecer relaciones con SQLAlchemy). 
En Python 2 la importación circular funciona perfectamente:

$ mkdir paquete
$ echo 'import b' > paquete/a.py
$ echo 'import a' > paquete/b.py
$ touch paquete/__init__.py
$ python
Python 2.7.3 (default, Aug  1 2012, 05:14:39)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
 >>> import paquete.a
 >>>
$ python
Python 2.7.3 (default, Aug  1 2012, 05:14:39)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
 >>> import paquete.b
 >>>

En Python 3 no funciona tal cual porque Python 3 exige la sintaxis "from 
paquete import module" o bien "from . import module":

$ python3
Python 3.2.3 (default, Oct 19 2012, 20:10:41)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
 >>> import paquete.a
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
   File "paquete/a.py", line 1, in <module>
     import b
ImportError: No module named b
 >>>

Sin embargo dichas sintaxis falla al hacer la importación circular:

$ echo 'from . import b' > paquete/a.py
$ echo 'from . import a' > paquete/b.py
$ python3
Python 3.2.3 (default, Oct 19 2012, 20:10:41)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
 >>> import paquete.a
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
   File "paquete/a.py", line 1, in <module>
     from . import b
   File "paquete/b.py", line 1, in <module>
     from . import a
ImportError: cannot import name a

Y la verdad, ya no sé que vuelta darle al asunto, fuera de unir los dos 
módulos (que preferiría evitarlo) o no migrar a Python 3 (una idea poco 
inteligente para una aplicación que puede tener tranquilamente 15 años 
por delante).

Gracias desde ya.

Saludos.
Julio.



More information about the pyar mailing list