En Sat, 10 Nov 2007 03:03:00 -0300, Paddy <[EMAIL PROTECTED]>
escribió:
> Hi,
> # If I have a function definition
> def f1(arg):
> global capturecall
> if capturecall:
> ...
> do_normal_stuff(arg)
>
> # and its later use:
> def f2():
> ...
> return f1(a and (b or c))
>
> # But also to do:
> capturecall = True
> result = f2()
> # And get the same result, but also save the actual
> # calling arguments to f1 either as a string:
> # "a and (b or c))"
> # Or a code object computing a and(b or c)
Would be enough to have the source line text?
<code test1.py>
def extract_caller_info():
import sys, traceback
return traceback.extract_stack(sys._getframe(2), limit=1)
def f1(arg):
if capturecall:
print extract_caller_info()
# do_normal_stuff(arg)
def f2():
a,b,c = 1,0,3
return f1(a and (b or c))
capturecall = True
result = f2()
</code>
output is like this:
[('test1.py', 12, 'f2', 'return f1(a and (b or c))')]
source file name, line number, function name, source line text.
> P.S. You might also have multiple calls where I
> would need to capture each individual argument
> expression of f1 e.g:
> def f3():
> ...
> return f1(a and b) or e or f1(c and d)
Tell your users that they'll have better results if those two calls are
split on different lines:
def f3():
return (f1(a and b)
or e
or f1(c and d))
Output:
[('test1.py', 18, 'f3', 'return (f1(a and b)')]
[('test1.py', 20, 'f3', 'or f1(c and d))')]
--
Gabriel Genellina
--
http://mail.python.org/mailman/listinfo/python-list