
October 9th, 2008, 04:35 AM
| | | inspect feature
Hello,
The 'inspect' module has this method:
inspect.getargvalues(frame)
It takes a frame and returns the parameters used to call it, including
the locals as defined in the frame, as shown. Quote: Quote: Quote: |
>>def f( a, b, d= None, *c, **e ):
| | | .... import inspect
.... return inspect.getargvalues( inspect.currentframe() )
.... Quote: Quote: Quote: |
>>f( 0, 1, 'abc', 'def', ( 3, 2 ), h= 'ghi' )
| | | (['a', 'b', 'd'], 'c', 'e', {'a': 0, 'c': ('def', (3, 2)), 'b': 1,
'e': {'h': 'g
hi'}, 'd': 'abc', 'inspect': <module 'inspect' from 'C:\Programs
\Python26\lib\in
spect.pyc'>})
However, if you wanted a decorator that examines the parameters to a
function, you're out of luck. By the time you have a frame, you're
already in the function.
Perhaps it would not be as common as something like 'join' for
example, or even the rest of the functions in 'inspect', but do you
think something similar to 'getargvalues' that accepted a function and
an argument list, and returned a dictionary mapping parameters to
values, could be useful? | 
October 9th, 2008, 09:55 AM
| | | Re: inspect feature
Aaron "Castironpi" Brady a écrit : Quote:
Hello,
>
The 'inspect' module has this method:
>
inspect.getargvalues(frame)
>
It takes a frame and returns the parameters used to call it, including
the locals as defined in the frame, as shown.
> Quote: Quote: |
>>>def f( a, b, d= None, *c, **e ):
| | ... import inspect
... return inspect.getargvalues( inspect.currentframe() )
... Quote: Quote: |
>>>f( 0, 1, 'abc', 'def', ( 3, 2 ), h= 'ghi' )
| | (['a', 'b', 'd'], 'c', 'e', {'a': 0, 'c': ('def', (3, 2)), 'b': 1,
'e': {'h': 'g
hi'}, 'd': 'abc', 'inspect': <module 'inspect' from 'C:\Programs
\Python26\lib\in
spect.pyc'>})
>
However, if you wanted a decorator that examines the parameters to a
function, you're out of luck. By the time you have a frame, you're
already in the function.
| Hem...
def decorator(func):
def _decorator(*args, *kw):
print "func args are ", *args, **kw
return func(*args, **kw)
return _decorator | 
October 9th, 2008, 07:55 PM
| | | Re: inspect feature
On Oct 9, 3:48*am, Bruno Desthuilliers <bruno.
42.desthuilli...@websiteburo.invalidwrote: Quote:
Aaron "Castironpi" Brady a écrit :
>
>
>> Quote: |
The 'inspect' module has this method:
| > Quote: |
inspect.getargvalues(frame)
| > Quote:
It takes a frame and returns the parameters used to call it, including
the locals as defined in the frame, as shown.
| > Quote: Quote: |
>>def f( a, b, d= None, *c, **e ):
| ... * * import inspect
... * * return inspect.getargvalues( inspect.currentframe() )
... Quote: |
>>f( 0, 1, 'abc', 'def', ( 3, 2 ), h= 'ghi' )
| (['a', 'b', 'd'], 'c', 'e', {'a': 0, 'c': ('def', (3, 2)), 'b': 1,
'e': {'h': 'g
hi'}, 'd': 'abc', 'inspect': <module 'inspect' from 'C:\Programs
\Python26\lib\in
spect.pyc'>})
| > Quote:
However, if you wanted a decorator that examines the parameters to a
function, you're out of luck. *By the time you have a frame, you're
already in the function.
| >
Hem...
>
def decorator(func):
* * *def _decorator(*args, *kw):
* * * * *print "func args are ", *args, **kw
* * * * *return func(*args, **kw)
* * *return _decorator
| It is less of a problem without tuple unpacking, but you still have
code like:
if len( args )>= 2:
b= args[ 1 ]
else:
try:
b= (somehow check b's default val.)
except NoDefaultVal:
raise ArgumentError
Worse yet, you have it for each parameter. Unless I missed something,
this is the only way to mimic/recreate the signature of the decoratee. | 
October 10th, 2008, 09:45 AM
| | | Re: inspect feature
Aaron "Castironpi" Brady a écrit : Quote:
On Oct 9, 3:48 am, Bruno Desthuilliers <bruno.
42.desthuilli...@websiteburo.invalidwrote: Quote:
>Aaron "Castironpi" Brady a écrit :
>>
>>
>> Quote:
>>Hello,
>>The 'inspect' module has this method:
>>inspect.getargvalues(frame)
>>It takes a frame and returns the parameters used to call it, including
>>the locals as defined in the frame, as shown.
>>>>>def f( a, b, d= None, *c, **e ):
>>... import inspect
>>... return inspect.getargvalues( inspect.currentframe() )
>>...
>>>>>f( 0, 1, 'abc', 'def', ( 3, 2 ), h= 'ghi' )
>>(['a', 'b', 'd'], 'c', 'e', {'a': 0, 'c': ('def', (3, 2)), 'b': 1,
>>'e': {'h': 'g
>>hi'}, 'd': 'abc', 'inspect': <module 'inspect' from 'C:\Programs
>>\Python26\lib\in
>>spect.pyc'>})
>>However, if you wanted a decorator that examines the parameters to a
>>function, you're out of luck. By the time you have a frame, you're
>>already in the function.
| >Hem...
>>
>def decorator(func):
> def _decorator(*args, *kw):
> print "func args are ", *args, **kw
> return func(*args, **kw)
> return _decorator
| >
It is less of a problem without tuple unpacking, but you still have
code like:
>
if len( args )>= 2:
b= args[ 1 ]
else:
try:
b= (somehow check b's default val.)
except NoDefaultVal:
raise ArgumentError
>
Worse yet, you have it for each parameter. Unless I missed something,
this is the only way to mimic/recreate the signature of the decoratee.
| I don't get what you're after ??? The decorator has full access to both
the actual params *and* the function's signature (via
inspect.getargspec). So your initial question "if you wanted a decorator
that examines the parameters to a function" seems fully answered. You
will indeed have to write a couple lines of code if you want the same
formating as the one you'd get with inspect.currentframe(), but what ?
FWIW, Michele Simionato's decorator module has some trick to allow for
signature-preserving decorators, so you may want to have a look - but
I'm not sure if this would solve your problem - at least in a sane way. | 
October 10th, 2008, 06:25 PM
| | | Re: inspect feature
On Oct 10, 3:36*am, Bruno Desthuilliers <bruno.
42.desthuilli...@websiteburo.invalidwrote: Quote:
Aaron "Castironpi" Brady a écrit :
>
>
> Quote:
On Oct 9, 3:48 am, Bruno Desthuilliers <bruno.
42.desthuilli...@websiteburo.invalidwrote: Quote: |
Aaron "Castironpi" Brady a écrit :
| | > Quote: Quote:
>Hello,
>The 'inspect' module has this method:
>inspect.getargvalues(frame)
>It takes a frame and returns the parameters used to call it, including
>the locals as defined in the frame, as shown.
>>>>def f( a, b, d= None, *c, **e ):
>... * * import inspect
>... * * return inspect.getargvalues( inspect.currentframe() )
>...
>>>>f( 0, 1, 'abc', 'def', ( 3, 2 ), h= 'ghi' )
>(['a', 'b', 'd'], 'c', 'e', {'a': 0, 'c': ('def', (3, 2)), 'b': 1,
>'e': {'h': 'g
>hi'}, 'd': 'abc', 'inspect': <module 'inspect' from 'C:\Programs
>\Python26\lib\in
>spect.pyc'>})
>However, if you wanted a decorator that examines the parameters to a
>function, you're out of luck. *By the time you have a frame, you're
>already in the function.
Hem...
| | > Quote: Quote:
def decorator(func):
* * *def _decorator(*args, *kw):
* * * * *print "func args are ", *args, **kw
* * * * *return func(*args, **kw)
* * *return _decorator
| | > Quote:
It is less of a problem without tuple unpacking, but you still have
code like:
| > Quote:
if len( args )>= 2:
* *b= args[ 1 ]
else:
* *try:
* * * b= (somehow check b's default val.)
* *except NoDefaultVal:
* * * raise ArgumentError
| > Quote:
Worse yet, you have it for each parameter. *Unless I missed something,
this is the only way to mimic/recreate the signature of the decoratee.
| >
I don't get what you're after ??? The decorator has full access to both
the actual params *and* the function's signature (via
inspect.getargspec). So your initial question "if you wanted a decorator
that examines the parameters to a function" seems fully answered. You
will indeed have to write a couple lines of code if you want the same
formating as the one you'd get with inspect.currentframe(), but what ?
>
FWIW, Michele Simionato's decorator module has some trick to allow for
signature-preserving decorators, so you may want to have a look - but
I'm not sure if this would solve your problem - at least in a sane way.
| It's not exactly the next Millennium problem, but there are some
substantial checks you have to do on a per-parameter basis to see the
same thing that a function sees, when all you have is *args, **kwargs.
You are wrapping a function with this signature:
def f( a, b, c= None, *d, **e ):
You want to find out the values of 'a', 'b', and 'c' in a decorator.
You have these calls:
f( 0, 1, 'abc', 'def', h= 'ghi' )
f( 0, 1 )
f( 0, 1, h= 'abc' )
f( 0, 1, 'abc', c= 'def' ) #raise TypeError: multiple values
How do you determine 'a', 'b', and 'c'? | 
October 14th, 2008, 08:15 AM
| | | Re: inspect feature
En Fri, 10 Oct 2008 14:18:53 -0300, Aaron "Castironpi" Brady
<castironpi@gmail.comescribió: Quote:
On Oct 10, 3:36*am, Bruno Desthuilliers <bruno.
42.desthuilli...@websiteburo.invalidwrote:
| Quote: Quote:
>I don't get what you're after ??? The decorator has full access to both
>the actual params *and* the function's signature (via
>inspect.getargspec). So your initial question "if you wanted a decorator
>that examines the parameters to a function" seems fully answered. You
>will indeed have to write a couple lines of code if you want the same
>formating as the one you'd get with inspect.currentframe(), but what ?
>>
>FWIW, Michele Simionato's decorator module has some trick to allow for
>signature-preserving decorators, so you may want to have a look - but
>I'm not sure if this would solve your problem - at least in a sane way.
| >
It's not exactly the next Millennium problem, but there are some
substantial checks you have to do on a per-parameter basis to see the
same thing that a function sees, when all you have is *args, **kwargs.
>
You are wrapping a function with this signature:
>
def f( a, b, c= None, *d, **e ):
>
You want to find out the values of 'a', 'b', and 'c' in a decorator.
You have these calls:
>
f( 0, 1, 'abc', 'def', h= 'ghi' )
f( 0, 1 )
f( 0, 1, h= 'abc' )
f( 0, 1, 'abc', c= 'def' ) #raise TypeError: multiple values
>
How do you determine 'a', 'b', and 'c'?
| I'm afraid you'll have to duplicate the logic described here: http://docs.python.org/reference/expressions.html#id9
To my knowledge, there is no available Python code (in the stdlib or
something) that already does that.
--
Gabriel Genellina | 
October 14th, 2008, 03:45 PM
| | | Re: inspect feature
On Oct 14, 3:06 am, "Gabriel Genellina" <gagsl-...@yahoo.com.ar>
wrote: Quote:
En Fri, 10 Oct 2008 14:18:53 -0300, Aaron "Castironpi" Brady
<castiro...@gmail.comescribió:
>
>
> Quote:
On Oct 10, 3:36 am, Bruno Desthuilliers <bruno.
42.desthuilli...@websiteburo.invalidwrote: Quote:
I don't get what you're after ??? The decorator has full access to both
the actual params *and* the function's signature (via
inspect.getargspec). So your initial question "if you wanted a decorator
that examines the parameters to a function" seems fully answered. You
will indeed have to write a couple lines of code if you want the same
formating as the one you'd get with inspect.currentframe(), but what ?
| | > Quote: Quote:
FWIW, Michele Simionato's decorator module has some trick to allow for
signature-preserving decorators, so you may want to have a look - but
I'm not sure if this would solve your problem - at least in a sane way..
| | > Quote:
It's not exactly the next Millennium problem, but there are some
substantial checks you have to do on a per-parameter basis to see the
same thing that a function sees, when all you have is *args, **kwargs.
| > Quote: |
You are wrapping a function with this signature:
| > Quote: |
def f( a, b, c= None, *d, **e ):
| > Quote:
You want to find out the values of 'a', 'b', and 'c' in a decorator.
You have these calls:
| > Quote:
f( 0, 1, 'abc', 'def', h= 'ghi' )
f( 0, 1 )
f( 0, 1, h= 'abc' )
f( 0, 1, 'abc', c= 'def' ) #raise TypeError: multiple values
| > Quote: |
How do you determine 'a', 'b', and 'c'?
| >
I'm afraid you'll have to duplicate the logic described here: http://docs.python.org/reference/expressions.html#id9
To my knowledge, there is no available Python code (in the stdlib or
something) that already does that.
| I wrote such a beast some time ago; it's hairy but to the best of my
knowledge it seems to reproduce the standard Python logic: http://code.activestate.com/recipes/551779/
George | 
October 14th, 2008, 07:45 PM
| | | Re: inspect feature
On Oct 14, 9:42*am, George Sakkis <george.sak...@gmail.comwrote: Quote:
On Oct 14, 3:06 am, "Gabriel Genellina" <gagsl-...@yahoo.com.ar>
wrote:
>
>
> Quote:
En Fri, 10 Oct 2008 14:18:53 -0300, Aaron "Castironpi" Brady
<castiro...@gmail.comescribió:
| > Quote: Quote:
On Oct 10, 3:36 am, Bruno Desthuilliers <bruno.
42.desthuilli...@websiteburo.invalidwrote:
>I don't get what you're after ??? The decorator has full access to both
>the actual params *and* the function's signature (via
>inspect.getargspec). So your initial question "if you wanted a decorator
>that examines the parameters to a function" seems fully answered. You
>will indeed have to write a couple lines of code if you want the same
>formating as the one you'd get with inspect.currentframe(), but what?
| | > Quote: Quote:
>FWIW, Michele Simionato's decorator module has some trick to allow for
>signature-preserving decorators, so you may want to have a look - but
>I'm not sure if this would solve your problem - at least in a sane way.
| | > Quote: Quote:
It's not exactly the next Millennium problem, but there are some
substantial checks you have to do on a per-parameter basis to see the
same thing that a function sees, when all you have is *args, **kwargs..
| | > Quote: Quote: |
You are wrapping a function with this signature:
| | > Quote: Quote: |
def f( a, b, c= None, *d, **e ):
| | > Quote: Quote:
You want to find out the values of 'a', 'b', and 'c' in a decorator.
You have these calls:
| | > Quote: Quote:
f( 0, 1, 'abc', 'def', h= 'ghi' )
f( 0, 1 )
f( 0, 1, h= 'abc' )
f( 0, 1, 'abc', c= 'def' ) #raise TypeError: multiple values
| | > Quote: Quote: |
How do you determine 'a', 'b', and 'c'?
| | >>
I wrote such a beast some time ago; it's hairy but to the best of my
knowledge it seems to reproduce the standard Python logic:http://code.activestate.com/recipes/551779/
>
George
| I didn't see a 'got a duplicate argument for keyword "d"' error, but I
can add one if I need to.
Is there some reason why the built-in behavior should not be made
available, such as it's poorly defined outside the function? Or is it
just the fact that it's complicated that keeps it out of 'inspect'? | 
October 14th, 2008, 08:35 PM
| | | Re: inspect feature
On Oct 14, 2:35 pm, "Aaron \"Castironpi\" Brady"
<castiro...@gmail.comwrote: Quote:
On Oct 14, 9:42 am, George Sakkis <george.sak...@gmail.comwrote:
>
>
> Quote:
On Oct 14, 3:06 am, "Gabriel Genellina" <gagsl-...@yahoo.com.ar>
wrote:
| > Quote: Quote:
En Fri, 10 Oct 2008 14:18:53 -0300, Aaron "Castironpi" Brady
<castiro...@gmail.comescribió:
| | > Quote: Quote:
On Oct 10, 3:36 am, Bruno Desthuilliers <bruno.
42.desthuilli...@websiteburo.invalidwrote:
I don't get what you're after ??? The decorator has full access toboth
the actual params *and* the function's signature (via
inspect.getargspec). So your initial question "if you wanted a decorator
that examines the parameters to a function" seems fully answered. You
will indeed have to write a couple lines of code if you want the same
formating as the one you'd get with inspect.currentframe(), but what ?
| | > Quote: Quote:
FWIW, Michele Simionato's decorator module has some trick to allowfor
signature-preserving decorators, so you may want to have a look - but
I'm not sure if this would solve your problem - at least in a saneway.
| | > Quote: Quote:
It's not exactly the next Millennium problem, but there are some
substantial checks you have to do on a per-parameter basis to see the
same thing that a function sees, when all you have is *args, **kwargs.
| | > Quote: Quote: |
You are wrapping a function with this signature:
| | > Quote: Quote: |
def f( a, b, c= None, *d, **e ):
| | > Quote: Quote:
You want to find out the values of 'a', 'b', and 'c' in a decorator..
You have these calls:
| | > Quote: Quote:
f( 0, 1, 'abc', 'def', h= 'ghi' )
f( 0, 1 )
f( 0, 1, h= 'abc' )
f( 0, 1, 'abc', c= 'def' ) #raise TypeError: multiple values
| | > Quote: Quote: |
How do you determine 'a', 'b', and 'c'?
| | >>>>
I didn't see a 'got a duplicate argument for keyword "d"' error, but I
can add one if I need to.
| Why don't you try it out: Quote: Quote: Quote:
>>def f( a, b, c= None, *d, **e ): pass
>>getcallargs(f, 0, 1, 'abc', c= 'def' )
| | | Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "getcallargs.py", line 53, in getcallargs
"argument '%s'" % (f_name,arg))
TypeError: f() got multiple values for keyword argument 'c'
George |
Posting Rules
| You may not post new threads You may not post replies You may not post attachments You may not edit your posts HTML code is Off | | | | | | What is Bytes?
We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights.
Get the best answers to your questions from over network members.
|