ImportError: Cannot import name X
This is a circular dependency. It can be solved without any structural modifications to the code. The problem occurs because in
vector you demand that
entity be made available for use immediately, and vice versa. The reason for this problem is that you asking to access the contents of the module before it is ready -- by using
from x import y. This is essentially the same as
import xy = x.ydel x
Python is able to detect circular dependencies and prevent the infinite loop of imports. Essentially all that happens is that an empty placeholder is created for the module (ie. it has no content). Once the circularly dependent modules are compiled it updates the imported module. This is works something like this.
a = module() # import a# rest of modulea.update_contents(real_a)
For python to be able to work with circular dependencies you must use
import x style only.
import xclass cls: def __init__(self): self.y = x.y
Since you are no longer referring to the contents of the module at the top level, python can compile the module without actually having to access the contents of the circular dependency. By top level I mean lines that will be executed during compilation as opposed to the contents of functions (eg.
y = x.y). Static or class variables accessing the module contents will also cause problems.