Injecting new names into the above frame

Boris Borcic bborcic at gmail.com
Sat Sep 13 09:22:12 EDT 2008


Why don't you use import and __import__() ? - They seem designed for such an 
application.

I mean, I am not against vicious hacks for the fun of them, but not if they 
serve the illusion that what they do can't (easily) be achieved other ways.

Cheers, BB

Peter Waller wrote:
> Dear Pythoners,
> 
> I know this will probably be perceived as 'evil voodoo', and fair
> enough: it probably is. I guess it is unpythonic.
> 
> .. but I want to know how to do it anyway - mostly for my own
> interest.
> 
> Consider the following snippet of code:
> 
> ---
> def Get( *names ):
>     if not names: return None
> 
>     frame = sys._getframe(1)
>     prevFrameLocals = frame.f_locals
> 
>     for name in names:
>         prevFrameLocals[ name ] = FetchObjectNamed( name )
> 
> Get("a", "b", "c")
> 
> print a, b, c
> ---
> 
> FetchObjectNamed() is an arbitrary function which takes a string and
> returns an object it got from some store somewhere.
> 
> This works fine at the module level, because names in the locals/
> globals dictionary can be played with in this way. The idea is to save
> lots of typing, i.e.
> 
> a, b, c = Get("a","b","c")
> 
> ..gets frustrating after much typing for many objects with long names.
> This is just an example, there are other instances I have where it
> would be nice to inject names into the frame above.
> 
> Of course, we hit a road block when we call 'Get' from a function
> rather than a module, because the locals dictionary does not get
> copied back into the code object automatically, so we have to add this
> snippet before the Get() function returns:
> 
> from ctypes import pythonapi, py_object, c_int
> pythonapi.PyFrame_LocalsToFast( py_object( frame ), 1 )
> 
> This copies back the names into the code object, and works fine.. that
> is, if the names already exist within the code object.
> 
> def MyFunction():
>     a = None
>     Get("a")
>     print a # Works
>     Get("b")
>     print b # Name error, b is undefined
> 
> Is there any way for Get() to define a new variable within
> MyFunction's code object? Or is there any programmatic way to, at
> runtime, insert new names into functions?
> 
> I don't care how hacky it is and whether it requires making calls to
> python's internals with ctypes - maybe the whole code object needs to
> be replaced? is it even possible to do that when the Get() function is
> about to return to this new code object?
> 
> Cheers,
> 
> - Peter
> --
> http://mail.python.org/mailman/listinfo/python-list
> 




More information about the Python-list mailing list