inspect feature

Aaron "Castironpi" Brady castironpi at gmail.com
Thu Oct 9 14:50:41 EDT 2008


On Oct 9, 3:48 am, Bruno Desthuilliers <bruno.
42.desthuilli... at websiteburo.invalid> wrote:
> Aaron "Castironpi" Brady a écrit :
>
>
>
> > 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.




More information about the Python-list mailing list