Qué significa Error de importación circular y cómo solucionarlo
Referencia del error
Error de importación circular
Lenguaje
Severidad
AltaCuándo ocurre
Una importación circular ocurre cuando el módulo A importa desde el módulo B, y el módulo B también importa desde el módulo A.
Posibles soluciones
Rompe el ciclo moviendo el código compartido a un tercer módulo del que ni A ni B importen. Usa importaciones locales (a nivel de función) para diferir la carga hasta que se llamen las funciones. Reestructura tu paquete para que las dependencias fluyan en una dirección.
Errores relacionados
Más detalles
Una importación circular ocurre cuando el módulo A importa desde el módulo B, y el módulo B también importa desde el módulo A. Cuando Python carga A por primera vez, comienza a cargar B, que intenta importar desde A antes de que A haya terminado de inicializarse, resultando en un ImportError o módulo parcialmente inicializado.
Por qué ocurre
- •Dos módulos que dependen entre sí se importan mutuamente a nivel de módulo.
- •Un módulo de utilidades importa desde un módulo de modelos que importa desde utilidades.
- •Constantes o helpers compartidos ubicados en un módulo que también importa lógica de dominio.
- •Frameworks con sistemas de plugins donde los plugins importan del núcleo y el núcleo importa plugins.
Posibles soluciones
Rompe el ciclo moviendo el código compartido a un tercer módulo del que ni A ni B importen. Usa importaciones locales (a nivel de función) para diferir la carga hasta que se llamen las funciones. Reestructura tu paquete para que las dependencias fluyan en una dirección.
Ejemplos
Código que causa el error
# a.py
from b import greet
def name():
return "Alice"
# b.py
from a import name
def greet():
return f"Hello {name()}"Error en la terminal
ImportError: cannot import name 'greet' from partially initialized module 'b' (most likely due to a circular import)
Código corregido
# a.py - no import from b at top level
def name():
return "Alice"
# b.py
def greet():
from a import name # local import breaks the cycle
return f"Hello {name()}"Practica en inglés
¿Cómo le explicarías un Circular Import Error a un compañero dev? Elige la frase correcta:
"I hit an error...
¿Listo para practicar tu inglés en el trabajo?
Lingua-e tiene ejercicios interactivos basados en conversaciones reales de developers: standups, code reviews, retrospectivas y más. Practica hasta que salga solo.
Prueba Lingua-e gratis