Circular import dependencies don't work well; depending
on the exact conditions they can leave you pulling your  hair
out for hours. In your example, just pull the global variable
out into a third module and have both of your major
modules import and reference it from there.

In general, you should never have circular imports at
load time. There are three general ways of handling
the issue:

1. Redesign to eliminate the circular dependencies.
2. Put the classes with the circular dependencies in
  the same module.
3. Load the backlinks at run time.

I may be old fashioned, but I put all of the import
statements at the top of the module. Putting them
into the middle of functions obscures the structure
of the code, at least to my eyes. I'd rather have them
all in one place.

I've got a Java package (Fit Library) that I'm porting
to Python that has a number of very nasty circular
import dependencies that I can't structure out easily:
they're fundamental to the functionality. I'm taking
the "load at run time" option, which works well since
the basic FIT package has a very competent dynamic
loader.

However, all of this is kind of advanced functionality.
Most applications don't require that kind of mess.

John Roth








"MackS" <[EMAIL PROTECTED]> wrote in message news:[EMAIL PROTECTED]
Hi

I'm new to Python, I've read the FAQ but still can't get the following
simple example working:

# file main_mod.py:

global_string = 'abc'

def main():

   import auxiliary_mod
   instance = auxiliary_mod.ClassA()
   instance.fun()
   return

main()

# file auxiliary_mod.py:

class ClassA:

 def fun(self):

   import main_mod

   print 'this is ClassA.fun() and global_string is ' +
main_mod.global_string

   return

In words, the problem is: I've a main module which defines a global
variable and instantiates a class defined in a second module, and a
method of that class needs to access the global variable defined in the
main module.

When I run main_mod.py the method is executed twice:

this is ClassA.fun() and global_string is abc
this is ClassA.fun() and global_string is abc

How can I avoid this problem even in this simple example? If I move the
import main_mod statement to the outside of the definion of ClassA I
get an exception:

Traceback (most recent call last):
 File "./main_mod.py", line 4, in ?
   import auxiliary_mod
 File "/manel/ewt/test/auxiliary_mod.py", line 4, in ?
   import main_mod
 File "/manel/ewt/test/main_mod.py", line 13, in ?
   main()
 File "/manel/ewt/test/main_mod.py", line 9, in main
   instance = auxiliary_mod.ClassA()
AttributeError: 'module' object has no attribute 'ClassA'


As far as I can tell I'm following the technique suggested by Guido himself to handle mutual imports:

"Guido van Rossum recommends avoiding all uses of from <module> import
..., and placing all code inside functions. Initializations of global
variables and class variables should use constants or built-in
functions only. This means everything from an imported module is
referenced as <module>.<name>."

[http://www.python.org/doc/faq/programming.html]

How can I get this simple example to work?

Thank you for any help in advance,

Mack


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

Reply via email to