access interactive namespace from module (shared namespace?)

2008-05-25 Thread Ulrich Dorda
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


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


Re: access interactive namespace from module (shared namespace?)

2008-05-25 Thread TeroV

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

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


Re: access interactive namespace from module (shared namespace?)

2008-05-25 Thread ulrich
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



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


Re: access interactive namespace from module (shared namespace?)

2008-05-25 Thread Peter Otten
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
--
http://mail.python.org/mailman/listinfo/python-list


Re: access interactive namespace from module (shared namespace?)

2008-05-25 Thread David C. Ullrich
On Sun, 25 May 2008 03:32:30 -0700 (PDT), [EMAIL PROTECTED] 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
--
http://mail.python.org/mailman/listinfo/python-list


Re: access interactive namespace from module (shared namespace?)

2008-05-25 Thread ulrich
Thanks a lot to all!

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

Cheers,

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