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