Lingua-e
← Errores
Python

Qué significa Error de importación circular y cómo solucionarlo

Referencia del error

Error de importación circular

Lenguaje

Python

Severidad

Alta

Cuá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.

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

Python

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