magic tricks
Jp Calderone
exarkun at intarweb.us
Fri Jun 6 14:52:24 EDT 2003
On Fri, Jun 06, 2003 at 11:41:53AM -0700, Michele Simionato wrote:
> #<change.py>
>
> import sys
> callerglobals=sys._getframe(1).f_globals
>
> def a(x):
> callerglobals['a']=x
>
> #</change.py>
>
> >>> import change
> >>> a=1
> >>> change.a(2)
> >>> a
> 2
>
> This works, but the standard library explicitely warns AGAINT this kind
> of magic tricks. Thus my question: what's the safe way of doing this
> (BTW, what can go wrong with sys._getframe approach) ?
>
This doesn't work as soon as you call change.a() from a frame where
globals() is not locals().
> In other words, I want to change a global variable of a given module by
> invoking a different module (and I know this is not a Good Thing ;-)
>
One approach:
import bar
xGlobal = None
def foo():
xGlobal = bar.changeMyGlobal()
Another is to simply -not- use globals that way.
class FooStash:
x = None
def foo(stash):
bar.changeMyStash(stash)
def main():
stash = FooStash()
foo(stash)
Hope this helps,
Jp
--
"There is no reason for any individual to have a computer in their
home."
-- Ken Olson, President of DEC, World Future Society
Convention, 1977
More information about the Python-list
mailing list