Help | Site Map
Connecting Tech Pros Worldwide
 
 
LinkBack Thread Tools
  #1  
Old October 9th, 2008, 04:35 AM
Aaron \Castironpi\ Brady
Guest
 
Posts: n/a
Default 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?

  #2  
Old October 9th, 2008, 09:55 AM
Bruno Desthuilliers
Guest
 
Posts: n/a
Default 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


  #3  
Old October 9th, 2008, 07:55 PM
Aaron \Castironpi\ Brady
Guest
 
Posts: n/a
Default Re: inspect feature

On Oct 9, 3:48*am, Bruno Desthuilliers <bruno.
42.desthuilli...@websiteburo.invalidwrote:
Quote:
Aaron "Castironpi" Brady a écrit :
>
>
>
Quote:
Hello,
>
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.

  #4  
Old October 10th, 2008, 09:45 AM
Bruno Desthuilliers
Guest
 
Posts: n/a
Default 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.
  #5  
Old October 10th, 2008, 06:25 PM
Aaron \Castironpi\ Brady
Guest
 
Posts: n/a
Default 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'?
  #6  
Old October 14th, 2008, 08:15 AM
Gabriel Genellina
Guest
 
Posts: n/a
Default 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

  #7  
Old October 14th, 2008, 03:45 PM
George Sakkis
Guest
 
Posts: n/a
Default 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
  #8  
Old October 14th, 2008, 07:45 PM
Aaron \Castironpi\ Brady
Guest
 
Posts: n/a
Default 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'?
>
Quote:
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
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'?
  #9  
Old October 14th, 2008, 08:35 PM
George Sakkis
Guest
 
Posts: n/a
Default 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'?
>
Quote:
Quote:
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.
>
Quote:
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/
>
Quote:
George
>
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
 

Bookmarks

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are Off
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On

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.
Post your question now . . .
It's fast and it's free

Popular Articles