¿Qué puedo hacer con "ImportError: No se puede importar el nombre X" o "AttributeError: ... (probablemente debido a una importación circular)"?

Resuelto jsells asked hace 12 años • 0 respuestas

Tengo un código distribuido en varios archivos que intentan separarse importentre sí, de la siguiente manera:

principal.py:

from entity import Ent

entidad.py:

from physics import Physics
class Ent:
    ...

física.py:

from entity import Ent
class Physics:
    ...

Luego corro main.pyy aparece el siguiente error:

Traceback (most recent call last):
File "main.py", line 2, in <module>
    from entity import Ent
File ".../entity.py", line 5, in <module>
    from physics import Physics
File ".../physics.py", line 2, in <module>
    from entity import Ent
ImportError: cannot import name Ent

Supongo que el error se debe a la importación entitydos veces, una vez main.pyy más tarde physics.py, pero ¿cómo puedo solucionar el problema?


Consulte también ¿Qué sucede cuando se utilizan importaciones mutuas o circulares (cíclicas) en Python? para obtener una descripción general de lo que está permitido y lo que causa un problema en las importaciones circulares de WRT. Consulte ¿Por qué las importaciones circulares aparentemente funcionan más arriba en la pila de llamadas pero luego generan un ImportError más abajo? para obtener detalles técnicos sobre por qué y cómo ocurre el problema.

jsells avatar Feb 13 '12 03:02 jsells
Aceptado

Tienes importaciones dependientes circulares. physics.pyse importa entityantes de que se defina la clase Ente physicsintenta importar entityque ya se está inicializando. Elimine la dependencia del physicsmódulo entity.

Teemu Ikonen avatar Feb 12 '2012 21:02 Teemu Ikonen

Si bien definitivamente debes evitar las dependencias circulares, puedes posponer las importaciones en Python.

Por ejemplo:

import SomeModule

def someFunction(arg):
    from some.dependency import DependentClass

esto (al menos en algunos casos) evitará el error.

bharling avatar Aug 28 '2013 11:08 bharling