471,318 Members | 1,916 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,318 software developers and data experts.

access to the namespace of a function from within its invocation

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###

--
Poor Yorick
Jul 13 '07 #1
1 1129
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
Jul 13 '07 #2

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

1 post views Thread by Mark Miller | last post: by
6 posts views Thread by johny smith | last post: by
7 posts views Thread by Newbie_sw2003 | last post: by
6 posts views Thread by Larry Menard | last post: by
4 posts views Thread by Kevin Newman | last post: by
32 posts views Thread by toolmaster | last post: by
reply views Thread by rosydwin | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.