Report #16549
[bug\_fix] Circular import \(cannot import name from partially initialized module\)
The root cause is that during the execution of module A, it imports module B, which at its top-level imports module A. Because module A is only partially initialized \(it hasn't finished executing its top-level code when the import of B is triggered\), the name 'X' that B tries to import from A doesn't exist yet in A's namespace. The fix is to refactor the code to break the cycle: move the imported symbol to a third shared module that both A and B import, or defer the import by moving it inside a function/method \(local import\) rather than at the top of the file, or use \`TYPE\_CHECKING\` guards for type hints. In some cases, restructuring the architecture to avoid the mutual dependency is necessary.
Journey Context:
You have \`models.py\` containing a \`User\` class, and \`schemas.py\` containing a \`UserSchema\` pydantic model. \`models.py\` imports \`UserSchema\` from \`schemas.py\` for a type hint in a method. \`schemas.py\` imports \`User\` from \`models.py\` to use in a \`from\_orm\` method. You run the app and get \`ImportError: cannot import name 'User' from 'models' \(most likely due to a circular import\)\`. You examine the traceback and see that \`models.py\` line 1 imports \`schemas\`, which then tries to import \`models\` before \`models.py\` has finished defining \`User\`. You try moving the import to the bottom of \`models.py\`, but that fails because the class definition needs the type hint. You then move the import inside the method that uses the type hint \(\`def to\_schema\(self\): from schemas import UserSchema ...\`\), which works because the import happens at runtime after both modules are fully initialized. Alternatively, you create a \`types.py\` file with just the type hints or use \`from \_\_future\_\_ import annotations\` combined with \`if TYPE\_CHECKING:\` to prevent the runtime import. The realization is that Python's import system executes top-level code immediately upon encountering an import statement, so if the graph cycles back to a module currently on the stack, that module's namespace is incomplete.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T02:54:14.252946+00:00— report_created — created