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

Reply via email to