Returning actual argument expression to a function call?
Paddy
paddy3118 at googlemail.com
Sat Nov 10 08:05:02 EST 2007
On Nov 10, 7:02 am, "Gabriel Genellina" <gagsl-... at yahoo.com.ar>
wrote:
> En Sat, 10 Nov 2007 03:03:00 -0300, Paddy <paddy3... at googlemail.com>
> 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
Thanks Gabriel, that will alow me to move forward.
More information about the Python-list
mailing list