Antes que nada: sí sé que ya hay muchas preguntas y respuestas sobre el tema de las importaciones circulares.Python: se necesitan importaciones circulares para la verificación de tipos
La respuesta es más o menos: "Diseña la estructura de tu Módulo/Clase correctamente y no necesitarás importaciones circulares". Eso es verdad. Traté muy duro de hacer un diseño adecuado para mi proyecto actual, en mi opinión, tuve éxito con esto.
Pero mi problema específico es el siguiente: Necesito una comprobación de tipo en un módulo que ya ha sido importado por el módulo que contiene la clase para comprobar. Pero esto arroja un error de importación.
así:
foo.py:
from bar import Bar
class Foo(object):
def __init__(self):
self.__bar = Bar(self)
bar.py:
from foo import Foo
class Bar(object):
def __init__(self, arg_instance_of_foo):
if not isinstance(arg_instance_of_foo, Foo):
raise TypeError()
Solución 1: Si lo modifico para comprobar el tipo de una comparación de cadenas , funcionará. Pero realmente no me gusta esta solución (la comparación de cadenas es bastante costosa para una verificación de tipo simple, y podría generar un problema cuando se trata de refactorizar).
bar_modified.py:
from foo import Foo
class Bar(object):
def __init__(self, arg_instance_of_foo):
if not arg_instance_of_foo.__class__.__name__ == "Foo":
raise TypeError()
Solución 2: También podría empacar las dos clases en un solo módulo. Pero mi proyecto tiene muchas clases diferentes, como el ejemplo "Barra", y quiero separarlas en diferentes archivos de módulos.
Después de mis propias 2 soluciones no son una opción para mí: ¿Alguien tiene una mejor solución para este problema?
Cómo sobre el uso escribiendo pato? –
Consulte https://stackoverflow.com/questions/39740632/python-type-hinting-without-cyclic-imports para obtener la respuesta correcta. –