By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
439,931 Members | 1,976 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 439,931 IT Pros & Developers. It's quick & easy.

access interactive namespace from module (shared namespace?)

P: n/a
I've got a probably embarrassing trivial problem with namespaces, but couldn't solve it
myself nor find an answer in the net. Hopefully one of you guys can help me.

What I want to do:
Use the interactive shell and e.g define the variable a there.
Then load a module and access a from within.

e.g file "utest.py"

def doit():
print 2*a

in the shell:

import utest
a=3
utest.doit() <- I want this to print 2*a, but of course obtain: <type
exceptions.NameError'>: global name 'a' is not defined

Any change I do to a in the shell should be seen from the doit() function, any variable
assignment I do in the doit() function should be seen in the shell. I guess it's somehow a
namespace sharing.

Actually the function doit() will contain an eval() function that should evaluate a (via a
gui) dynamically inserted expression.

Any one got a clue? (a clue what I try to say and how to help?!)

Thanks a lot in advance!!

Ulrich
Jun 27 '08 #1
Share this Question
Share on Google+
6 Replies


P: n/a
Ulrich Dorda wrote:
I've got a probably embarrassing trivial problem with namespaces, but
couldn't solve it myself nor find an answer in the net. Hopefully one of
you guys can help me.

What I want to do:
Use the interactive shell and e.g define the variable a there.
Then load a module and access a from within.

e.g file "utest.py"

def doit():
print 2*a

in the shell:

import utest
a=3
utest.doit() <- I want this to print 2*a, but of course obtain: <type
exceptions.NameError'>: global name 'a' is not defined

Any change I do to a in the shell should be seen from the doit()
function, any variable assignment I do in the doit() function should be
seen in the shell. I guess it's somehow a namespace sharing.

Actually the function doit() will contain an eval() function that should
evaluate a (via a gui) dynamically inserted expression.

Any one got a clue? (a clue what I try to say and how to help?!)

Thanks a lot in advance!!

Ulrich

Here is one way

#utest.py:
def doit(valuemap):
print 2*valuemap['a']

Python 2.5.1 (r251:54863, Mar 7 2008, 04:10:12)
[GCC 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>a = 4
import utest
utest.doit(locals())
8
>>>
Jun 27 '08 #2

P: n/a
Thanks for the reply,

Of course the suggested solution is working and good, but a bit
complicated. The module/function where i need to access the variable
value from the interactive shell is burried quite deep and I would
nedd to hand the locals() quite often from one module to another.
Furthermore it makes the call function slightly more complicated, as
the locals()-argunment has to be given every time.

I was hoping for something a bit different: If I wanted to access a
value b from another module "utest2.py", I would simply need to type
in utest.py: import utest2; print 2*utest2.b
Isn't there a name for the interactive namespace (like here the
utest2), which I can use to access the variable without handing the
whole dictionary?

Cheers,

Ulrich

Jun 27 '08 #3

P: n/a
Ulrich Dorda wrote:
I've got a probably embarrassing trivial problem with namespaces, but
couldn't solve it myself nor find an answer in the net. Hopefully one of
you guys can help me.

What I want to do:
Use the interactive shell and e.g define the variable a there.
Then load a module and access a from within.

e.g file "utest.py"

def doit():
print 2*a

in the shell:

import utest
a=3
utest.doit() <- I want this to print 2*a, but of course obtain: <type
exceptions.NameError'>: global name 'a' is not defined

Any change I do to a in the shell should be seen from the doit() function,
any variable assignment I do in the doit() function should be seen in the
shell. I guess it's somehow a namespace sharing.

Actually the function doit() will contain an eval() function that should
evaluate a (via a gui) dynamically inserted expression.

Any one got a clue? (a clue what I try to say and how to help?!)

Thanks a lot in advance!!
While the sane approach to this is

def doit(a):
print 2 * a

here is an insane one:

import sys

def f(): pass
function = type(f)

def snatch_globals(f):
def g(*args, **kw):
return function(f.func_code, sys._getframe(1).f_globals)(*args,
**kw)
return g

@snatch_globals
def doit():
print 2 * a

Peter
Jun 27 '08 #4

P: n/a
On Sun, 25 May 2008 03:32:30 -0700 (PDT), ul****@dorda.net wrote:
>Thanks for the reply,

Of course the suggested solution is working and good, but a bit
complicated. The module/function where i need to access the variable
value from the interactive shell is burried quite deep and I would
nedd to hand the locals() quite often from one module to another.
Furthermore it makes the call function slightly more complicated, as
the locals()-argunment has to be given every time.

I was hoping for something a bit different: If I wanted to access a
value b from another module "utest2.py", I would simply need to type
in utest.py: import utest2; print 2*utest2.b
Isn't there a name for the interactive namespace (like here the
utest2), which I can use to access the variable without handing the
whole dictionary?
"""utest.py"""

import __main__

def doit():
print 2*__main__.a
>Cheers,

Ulrich

David C. Ullrich
Jun 27 '08 #5

P: n/a
Thanks a lot to all!

Apart from obtaining the solution I was searching for, I learned a lot
by studying your answers!

Cheers,

Ulrich
Jun 27 '08 #6

P: n/a
On Sun, 25 May 2008 05:56:37 -0700 (PDT), ul****@dorda.net wrote:
>Thanks a lot to all!

Apart from obtaining the solution I was searching for, I learned a lot
by studying your answers!
Since my solution seems to have been the one you were looking
for (I was surprised nobody else suggested it) maybe I should
enphasize that people better informed than me had the same
reaction as I did to your question:

While this is something you can do if you want it's reallly hard
to see why it's a good idea - simply passing data to functions
in the other unit as parameters seems better.
>Cheers,

Ulrich
David C. Ullrich
Jun 27 '08 #7

This discussion thread is closed

Replies have been disabled for this discussion.