inspect feature
Bruno Desthuilliers
bruno.42.desthuilliers at websiteburo.invalid
Fri Oct 10 04:36:35 EDT 2008
Aaron "Castironpi" Brady a écrit :
> 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.
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.
More information about the Python-list
mailing list