Question about circular imports

OKB (not okblacke) brenNOSPAMbarn at NObrenSPAMbarn.net
Mon Feb 27 22:55:12 EST 2012


Frank Millman wrote:

>>
>> To avoid the tedious reference, follow this with
>> read = sound.formats.wavread # choose the identifier you prefer
>>
> 
> @Terry and OKB
> 
> I tried that, but it does not work.
> 
> a.py
> /b
>     __init__.py
>     c.py
>    d.py
> 
> a.py -
>     from b import c
> c.py -
>     import b.d
> d.py -
>     import b.c
> 
> If I run a.py, it returns with no error.
> 
> c.py -
>     import b.d
>     d = b.d
> d.py -
>     import b.c
>     c = b.c
> 
> If I run a.py, I get
> 
> Traceback (most recent call last):
>   File "F:\tests\a.py", line 1, in <module>
>     from b import c
>   File "F:\tests\b\c.py", line 1, in <module>
>     import b.d
>   File "F:\tests\b\d.py", line 2, in <module>
>     c = b.c
> AttributeError: 'module' object has no attribute 'c'
> 
> I get the same if I try 'import b.c as c'.

    	Interesting, you're right.  Note that it will work in c.py but not 
in d.py

    	Anyway, testing this just reinforced my distaste for circular 
imports.  Just trying to think about how it ought to work with a 
importing c but then c and d importing each other makes my brain hurt.  
Refactoring the files so that common code is in a separate library 
imported by both is easier to understand, and has the nice side bonus 
that it works.

-- 
--OKB (not okblacke)
Brendan Barnwell
"Do not follow where the path may lead.  Go, instead, where there is
no path, and leave a trail."
	--author unknown



More information about the Python-list mailing list