caught in the import web again

dieter dieter at
Mon Nov 17 08:08:40 CET 2014

"Charles T. Smith" < at> writes:
> ...
> Are others equally frustrated by this or is there a trick or principle 
> that I'm missing.  At this point, I guess the way I'll have to proceed is 
> to put every class in its own file, no matter how small.  Hopefully that 
> takes care of the problem.

Recursive imports are inherently difficult. It is best if
a careful design avoids it (note that a cycle free dependency
structure is much easier to handle than a cyclic one -- not only
for Python).

If you think such a cycle free module structure is impossible
in your case, then try to delay module related operations:

   *  consider local imports (imports inside a function).
      They delay the import until the function is called rather
      than execute it at module import time.

   *  prefer "import <module>" over "from <module> import ..."
      This may delay the module access; perhaps (but not
      necessarily) sufficiently such that the accessed object
      is already defined.

Neither of these approaches is complete - you may still get
cyclic import dependencies and related problems. Usually, you
need a careful module dependency design to avoid cyclic dependencies

> I compared perl's object-oriented philosophy with python's and didn't 
> like how perl *requires* you to put everything into its own file.  Now it 
> looks like python does, too, implicitly.

If you put everything in a single file, then you do not get
recursive imports (but you may still have other problems related to
cyclic dependencies). Thus, Python's difficulties with recursive
imports do not force you to "put everything in its own file".

If you think about it, you will recognize that cyclic dependencies are
inherently difficult (e.g. "chicken - egg" type problems)
and that the way Python handles cyclic
import dependencies is rather natural (and understandable).

More information about the Python-list mailing list