"Frank Millman" <fr...@chagford.com> wrote in message news:i3ov9e$du...@dough.gmane.org...
Hi all

I know the problems related to circular imports, and I know some of the techniques to get around them. However, I find that I bump my head into them from time to time, which means, I guess, that I have not fully understood how to organise my code so that I avoid them in the first place.

[...]

So I think my main question is, is this a symptom of a flaw in my approach, or is this something that all programmers bump into from time to time?


Thanks for the replies. All good info, but it was Ethan that put me onto the right track.

I omitted to mention one thing originally, as I did not think it important, but it turns out to be crucial. My code is organised into three 'packages', not 'modules'.

To reproduce my situation, I did some tests with the following hierarchy -

top/
   a.py
   /bb
       __init__.py
       b.py
   /cc
       __init__.py
       c.py

a.py
----
import bb.b
import cc.c
bb.b.foo()
cc.c.foo()

b.py
----
import cc.c
def foo():
   print 'in b.foo, call c.bar'
   cc.c.bar()
def bar():
   print '  bar in b'

c.py
----
import bb.b
def foo():
   print 'in c.foo, call b.bar'
   bb.b.bar()
def bar():
   print '  bar in c'

If I run 'a.py', I get the correct result -

in b.foo, call c.bar
 bar in c
in c.foo, call b.bar
 bar in b

I changed 'a.py' -

a.py
----
from bb import b
from cc import c
b.foo()
c.foo()

It still worked.

Next I changed 'b.py' -

b.py
----
from cc import c
def foo():
   print 'in b.foo, call c.bar'
   c.bar()
def bar():
   print '  bar in b'

It still worked.

Then I changed 'c.py' -

c.py
----
from bb import b
def foo():
   print 'in b.foo, call c.bar'
   b.bar()
def bar():
   print '  bar in b'

Now I get the following traceback -
Traceback (most recent call last):
 File "F:\dd\a.py", line 1, in <module>
   from bb import b
 File "F:\dd\bb\b.py", line 1, in <module>
   from cc import c
 File "F:\dd\cc\c.py", line 1, in <module>
   from bb import b
ImportError: cannot import name b

Now that I understand this, I can work around my problem by using fully-qualified module names.

But it would be interesting to know the underlying reason for this behaviour.

I am using python 2.6.2.

Thanks for any insights.

Frank


--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to