Inclusión mutua de módulos en python
Pensando en un desarrollo que voy a iniciar, me dí cuenta que podía tener una inclusión mutua de módulos, y como no tenía claro como se comporta python, decidí probarlo con:
# A.py
from B import B
class R:
def __str__(self):
return "hello world"
if (__name__ == "__main__"):
b = B()
b.r = R()
print "b: ",b
from A import R
class B:
def __init__(self):
self.r = R()
def __str__(self):
s = str(self.r)
return s
Dándome el error que comento en este post [comp.lang.python].
El post lo puse cuando no había encontrado nada sobre el problema, luego buscando mas correctamente me encontré un post en los grupos. De hecho hay varios, buscando por 'mutual'
Y una entrada en la faq de python.
En una respuesta del post me pasaron este link.
Y volviendo al problema...
Al ser python un lenguaje interpretado, es muy posible que realmente no sea necesario hacer el import (como va a ser mi caso). El tipo del objeto definido en 'A' y que usará 'B', se determinará en tiempo de ejecución. Una mente acostumbrada a lenguajes compilados, como la mía, no cayó en esto.
De todas formas, siempre estaría la solución de refactorizar el código (la que mas me gusta personalmente), o bien hacer el import dentro de un método o función (lo he probado y funciona).
Para acabar, muestro el código final, sin necesidad del import:
El post lo puse cuando no había encontrado nada sobre el problema, luego buscando mas correctamente me encontré un post en los grupos. De hecho hay varios, buscando por 'mutual'
Y una entrada en la faq de python.
En una respuesta del post me pasaron este link.
Y volviendo al problema...
Al ser python un lenguaje interpretado, es muy posible que realmente no sea necesario hacer el import (como va a ser mi caso). El tipo del objeto definido en 'A' y que usará 'B', se determinará en tiempo de ejecución. Una mente acostumbrada a lenguajes compilados, como la mía, no cayó en esto.
De todas formas, siempre estaría la solución de refactorizar el código (la que mas me gusta personalmente), o bien hacer el import dentro de un método o función (lo he probado y funciona).
Para acabar, muestro el código final, sin necesidad del import:
# A.py
from B import B
class R:
def __str__(self):
return "hello world"
if (__name__ == "__main__"):
b = B()
b.r = R()
print "b: ",b
# B.py
class B:
def __init__(self):
self.r = None
def __str__(self):
s = str(self.r)
return s
No hay comentarios:
Publicar un comentario