access interactive namespace from module (shared namespace?)
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?)
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?)
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?)
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?)
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?)
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