Chris Angelico wrote:
One piece of sophistication that I would rather like to see, but don't
know how to do. Instead of *args,**kwargs, is it possible to somehow
copy in the function's actual signature? I was testing this out in
IDLE, and the fly help for the function no longer gave useful info
about its argument list.
If you want to roll your own, it looks something like this:
2.x code
----------------------------------------------------------------------
def trace(func, debugmode=debugmode):
if debugmode:
name = func.__name__
argspec = inspect.getargspec(func)
signature = inspect.formatargspec(
formatvalue=lambda val: "", *argspec)[1:-1] # trim parens
new_func = (
'def _wrapper_(%(signature)s):\n'
' print(">"+func.__name__)\n'
' result = func(%(signature)s)\n'
' print("<"+func.__name__)\n'
' return result\n'
% {'signature':signature}
)
evaldict = {'func':func}
exec new_func in evaldict
wrapped = evaldict['_wrapper_']
wrapped.__name__ = name
wrapped.__doc__ = func.__doc__
wrapped.__module__ = func.__module__
wrapped.__dict__ = func.__dict__
wrapped.func_defaults = func.func_defaults
return wrapped
return func
----------------------------------------------------------------------
The downside (which you get even with Michele's decorator module) is
that tracebacks aren't quite as clean.
~Ethan~
--
http://mail.python.org/mailman/listinfo/python-list