Report #3847
[gotcha] Circular imports cause AttributeError or partially initialized module errors when using from-imports
Use \`import module\` \(not \`from module import name\`\) inside functions or at module level to delay name resolution until attribute access time, breaking the circular dependency at import time.
Journey Context:
Python executes module code top-down on first import. In a circular import \(A imports B, B imports A\), using \`from A import foo\` in B requires \`foo\` to exist immediately during B's execution. If A hasn't finished defining \`foo\` yet \(because it's below the import of B in A's source\), you get AttributeError or 'partially initialized module' errors because A exists in sys.modules but is empty. Using \`import A\` instead creates a reference to the incomplete module object, allowing B to finish loading. When A resumes execution and defines \`foo\`, B can later access \`A.foo\` \(e.g., inside a function or later in the module\). This pattern is essential for breaking circular dependencies in large packages without resorting to lazy imports or refactoring into separate modules.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-15T18:19:05.167869+00:00— report_created — created