persisting data within a module

Peter J. Bismuti peter.j.bismuti at boeing.com
Tue Nov 13 11:09:01 EST 2007


How is that state different depending on whether a module has been simply 
imported (#2.  some other block of code has __name__ == "__main__") and the 
script itself being run (#1. and having __name__=="__main__")?

Ultimately, what I want is for a module to remember (persist) the value of A, 
regardless of how the module has been loaded into the interpreter.

Thanks

> Modules retain state their state across all imports in the same
> interpreter instance.  Module state is not shared among different
> instances of the interpreter.
>
> > For example, consider the two simple modules below.  The first method
> > fails and I'm not sure exactly why.  (Note:  assume one instance of an
> > interpreter. In my case a 3rd party software tool that starts an
> > interpreter when it launches).
> >
> > Two alternate ways of running it:
> >
> > 1. (FAILS: RESULTS A = 0)  Use the module "test" itself as the driver
> > using the conditional statement if (__name__=="__main__"):
> >
> > test.py
> > run2.py
>
> Ok, what do you mean by this?  Do you mean run test.py and then run
> run2.py?  In so, then you will have *two* instances -- one for each
> file being executed.  You can only have one main module per
> interpreter instance.  I suspect this is the source of your confusion.
>
> > or,
> >
> > 2.  (SUCCES: RESULTS A = 10)   Use "run.py" as the driver.
> >
> > run.py
> >
> > _________test.py__________________
> >
> > import sys,os
> >
> > A = 0
> >
> > def getA():
> >   global A
> >   return A
> >
> > def run():
> >   global A
> >   A = 10
> >
> > if (__name__=="__main__"):
> >   run()
>
> Here, A is only initialized when the module is loaded iff it is the
> main module.  If it's not the main module, then it will have A set to
> 0 until some other code calls run().
>
> > _________run.py__________________
> >
> > import test
> >
> > test.run()
> > print "A = " + str(test.getA())
>
> This code calls test.run(), which is necessary for A to be 10.
>
> > _________run2.py__________________
> >
> > import test
> >
> > print "A = " + str(test.getA())
> >
> > --
>
> This code gets the value of test.A without calling test.run().  Since
> test.run() was not called, A is the value it was initialized when the
> test module was loaded -- namely, 0.
>
> Hope this helps,
>
> --Nathan Davis

-- 


Peter Bismuti
Boeing Information Technology
Renton, WA
(425) 234-0873 W
(425) 442-7775 C



More information about the Python-list mailing list