Circular Import?
Benjamin Niemann
pink at odahoda.de
Sat Aug 28 05:38:31 EDT 2004
Chris S. wrote:
> Consider the sample case:
>
> ## a.py
> import d
> import b
> b.App()
>
> ## b.py
> from c import C
> B = 'B'
> class App(object):pass
>
> ## c.py
> from d import D
> class C(object):pass
>
> ## d.py
> from b import B
> D = 'D'
>
> Executing a.py will return:
> Traceback (most recent call last):
> File "a.py", line 1, in ?
> import d
> File "d.py", line 1, in ?
> from b import B
> File "b.py", line 1, in ?
> from c import C
> File "c.py", line 1, in ?
> from d import D
> ImportError: cannot import name D
>
> I'm assuming this is the result of the circular imports. This isn't a
> bug, right? Is there any way around it?
Yep, circular imports only cause problems. Workarounds:
- design your application not to use circular dependencies, as these are
usually a sign for bad design
- use late imports:
## foo.py
class A:
def a():
import bar # instead of importing at the beginning of foo
bar.B()
## bar.py
import foo
def B():
pass
class C(A):
pass
More information about the Python-list
mailing list