access to the namespace of a function from within its invocation

Bruno Desthuilliers bruno.42.desthuilliers at wtf.websiteburo.oops.com
Fri Jul 13 11:03:54 EDT 2007


Poor Yorick a écrit :
> In the example below, the attribute "data" is added to a function 
> object.  "me" can be used to get the function when it is invoked using 
> an identifier that matches the "co_name" attribute of function's code 
> object.  Can anyone conjure an example of accessing fun2.data from 
> without prior knowledge of the value of fun2.f_code.co_name?
> 
> ###code begin###
> #!/bin/python
> 
> import sys
> 
> def me():
>    t = sys._getframe(0)
>    return t.f_back.f_globals[t.f_back.f_code.co_name]
> def fun1():
>    m = me
>    print me().data
>    def makefun () :
>    def tmpfunc():
>        print 'need something like me().data'
>    return tmpfunc
> 
> fun1.s = fun1
> fun1.data=['one', 'two', 'three']
> fun1()
> fun2 = makefun()
> fun2.data=['four', 'five','six']
> fun2()
> 
> ###code end###
> 

Not a direct answer to your question, but anyway;

As soon as you want to bundle data with behaviour, OO comes to mind. 
Good news is that Python is actually an OOPL which implements functions 
as objects and let you define function-like ('callable') objects.

class DataFunc(object):
   def __init__(self, data):
     self.data = data

   def __call__(self, *args, **kw):
     print self.data

fun2 = DataFunc(['four', 'five', 'forty-two'])
fun2()

Note that you'll also have to correctly implement the __get__ method if 
you want an instance of DataFunc to be usable as a method (look for the 
descriptor protocol in the FineManual(tm) for more information on this 
point).

HTH



More information about the Python-list mailing list