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.
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ómo solucionarlo
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.
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()}"Errores relacionados
¿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