By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
439,932 Members | 1,908 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 439,932 IT Pros & Developers. It's quick & easy.

How to add function return value

P: n/a
I need to write functions that return locals() as follows,
def func1():
a = 1
return locals()

def func2():
b = 2
return locals()

Can I write a decorator that it can automately do this conversion

def func1()
a = 1

--->

def func1():
a = 1
return locals()

Jun 27 '08 #1
Share this Question
Share on Google+
2 Replies


P: n/a
On May 30, 6:21*pm, HYRY <ruoyu0...@gmail.comwrote:
Can I write a decorator that it can automately do this conversion

def func1()
* * a = 1

--->

def func1():
* * a = 1
* * return locals()
Not sure why you would want to do this, but there are several ways.

1. Make bytecode hack decorator that transforms the final "return
None" into "return locals()". A recipe that shows the basic technique
is at: http://aspn.activestate.com/ASPN/Coo.../Recipe/277940

2. Retrieve the source using inspect.getsourcelines(f). Then, append a
"return locals()" to the end of the function and run it through exec.

3. Try hacking a tracing/debugging utility.

4. Run the sourcefile through tokenize, make the appropriate
insertion, and then untokenize.

. . .

Raymond
Jun 27 '08 #2

P: n/a
On May 30, 10:16*pm, Raymond Hettinger <pyt...@rcn.comwrote:
On May 30, 6:21*pm, HYRY <ruoyu0...@gmail.comwrote:
Can I write a decorator that it can automately do this conversion
def func1()
* * a = 1
--->
def func1():
* * a = 1
* * return locals()

Not sure why you would want to do this, but there are several ways.

1. Make bytecode hack decorator that transforms the final "return
None" into "return locals()". *A recipe that shows the basic technique
is at:http://aspn.activestate.com/ASPN/Coo.../Recipe/277940

2. Retrieve the source using inspect.getsourcelines(f). Then, append a
"return locals()" to the end of the function and run it through exec.

3. Try hacking a tracing/debugging utility.

4. Run the sourcefile through tokenize, make the appropriate
insertion, and then untokenize.

Here's an illustration of (3):

import sys
import functools

def withlocals(f):
@functools.wraps(f)
def wrapper(*args, **kwds):
f_locals = {}
def probe(frame, event, arg):
if event == 'return':
f_locals.update(frame.f_locals)
return probe
sys.settrace(probe)
try: res = f(*args,**kwds)
finally: sys.settrace(None)
return (res, f_locals)
return wrapper

# example

@withlocals
def foo(x, y=0, *args, **kwds):
a = max(x,y)
b = len(args)
c = min(kwds.values())
return a+b+c

r,locs = foo(1,2,3,4,a=5,b=6)
print locs

George
Jun 27 '08 #3

This discussion thread is closed

Replies have been disabled for this discussion.