473,240 Members | 1,458 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,240 software developers and data experts.

persisting data within a module

I'm having trouble understanding how namespaces work in modules. I want to
execute a module within the interpreter and then have values that are
calculated persist so that other modules that get executed can retrieve them.

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

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()
_________run.py__________________

import test

test.run()
print "A = " + str(test.getA())

_________run2.py__________________

import test

print "A = " + str(test.getA())

--
Peter Bismuti
Boeing Information Technology
Renton, WA
(425) 234-0873 W
(425) 442-7775 C
Nov 13 '07 #1
4 1641
On Nov 12, 5:30 pm, "Peter J. Bismuti" <peter.j.bism...@boeing.com>
wrote:
I'm having trouble understanding how namespaces work in modules. I want to
execute a module within the interpreter and then have values that are
calculated persist so that other modules that get executed can retrieve them.
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

Nov 13 '07 #2
I'm not sure how to better state my question than to post my code.

The question boils down to which namespace to variable in the module (in this
case A) end up in depending on whether or not the module is simply imported
by another module which acts as the driver (run.py is __main__), or when the
module drives itself (test.py __main__).

For example: my guess is that in the first case A ends up in the namespace of
test and could be referenced by test.A, in the second case A ends up in the
global namespace (and therefore must be referred to as simply A by other
modules).

Can anyone please shed some light on this for me?

Thanks
I'm having trouble understanding how namespaces work in modules. I want
to execute a module within the interpreter and then have values that are
calculated persist so that other modules that get executed can retrieve
them.

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
Nov 13 '07 #3
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
Nov 13 '07 #4
En Tue, 13 Nov 2007 13:09:01 -0300, Peter J. Bismuti
<pe*************@boeing.comescribió:
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__")?
It's not different at all, or I don't understand the question.
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.
It doesn't care. If you have a variable A in (the global namespace of) a
module, it's there, no matter how the module has been loaded. A namespace
has no concept of "history", it's just a mapping from names to objects.

Unless you're talking about this situation (should be on the FAQ, but I
can't find it):

--- begin one.py ---
A = 1

if __name__=='__main__':
print "In one.py, A=", A
import two
print "In one.py, after importing two, A=", A
--- end one.py

--- begin two.py ---
import one
print "In two.py, one.A=", one.A
one.A = 222
print "In two.py, after modifying one.A=", one.A
--- end one.py

Executing:
>python one.py
you get this output:

In one.py, A= 1
In two.py, one.A= 1
In two.py, after modifying one.A= 222
In one.py, after importing two, A= 1

In this (pathological) case, there are TWO different instances of the
one.py module, because modules are indexed by name in the sys.modules
dictionary, and the first instance is under the "__main__" name, and the
second instance is under the "one" name.
So: don't import the main script again.

--
Gabriel Genellina

Nov 14 '07 #5

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

2
by: Chris S. | last post by:
Out of a somewhat academic interest, I've created a rudimentary module for persisting dynamically created objects and data structures in plain Python source code. Presently, it's a little under a...
2
by: Citoyen du Monde | last post by:
Trying to get some ideas on a simple javascript project (to teach myself the language). I want to develop a client-side vocabulary practice application that would allow users to enter their own...
4
by: Dave Veeneman | last post by:
When does serializing objects make more sense than persisting them to a database? I'm new to object serialization, and I'm trying to get a feel for when to use it. Here is an example: I'm...
1
by: lim | last post by:
What is the possible error that occurs when the Page_load event is not triggered during execution. In my page there's some basic server control. Is there any loops holes?
1
by: Larry Bird | last post by:
I've created a AlertDataClass below within the class I have tables and column that I've create. In the AlertDataAccess class I'm trying to insert data into my tables. AlertDataAccess is a Module...
2
by: xenophon | last post by:
I added a Hidden Form Field to a form in the code behind. The value is being set in JavaScript client-side, but it is not persisting to the server in the PostBack. I know the value is being set...
5
by: Dick | last post by:
I have a GridView bound to an ObjectDataSource. I have a Button that calls GridView.DataBind. I want the row that is selected before the DataBind to still be selected afterwards. This happens...
18
by: Joel Hedlund | last post by:
Hi! The question of type checking/enforcing has bothered me for a while, and since this newsgroup has a wealth of competence subscribed to it, I figured this would be a great way of learning...
1
by: Nikron | last post by:
Hi, I'm having an issue with the ASP.NET 2.0 Treeview control and persisting its' state accross requests. My Control is embedded within a master page and is used for site navigation. My problem...
3
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 3 Jan 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). For other local times, please check World Time Buddy In...
0
by: jianzs | last post by:
Introduction Cloud-native applications are conventionally identified as those designed and nurtured on cloud infrastructure. Such applications, rooted in cloud technologies, skillfully benefit from...
0
by: abbasky | last post by:
### Vandf component communication method one: data sharing ​ Vandf components can achieve data exchange through data sharing, state sharing, events, and other methods. Vandf's data exchange method...
0
by: fareedcanada | last post by:
Hello I am trying to split number on their count. suppose i have 121314151617 (12cnt) then number should be split like 12,13,14,15,16,17 and if 11314151617 (11cnt) then should be split like...
0
by: stefan129 | last post by:
Hey forum members, I'm exploring options for SSL certificates for multiple domains. Has anyone had experience with multi-domain SSL certificates? Any recommendations on reliable providers or specific...
0
Git
by: egorbl4 | last post by:
Скачал я git, хотел начать настройку, а там вылезло вот это Что это? Что мне с этим делать? ...
0
by: DolphinDB | last post by:
The formulas of 101 quantitative trading alphas used by WorldQuant were presented in the paper 101 Formulaic Alphas. However, some formulas are complex, leading to challenges in calculation. Take...
0
by: DolphinDB | last post by:
Tired of spending countless mintues downsampling your data? Look no further! In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
0
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.