Python create decorator preserving function arguments
AFAIK, it is possible only since Python 3.3 with the Signature
object:
def identity_decorator(wrapped):
def wrapper(*args, **kwargs):
return wrapped(*args, **kwargs)
wrapper.__signature__ = inspect.signature(wrapped) # the magic is here!
return wrapper
Then, you can do:
@identity_decorator
def foo(a):
pass
and finally:
>>> inspect.getargspec(foo)
ArgSpec(args=['a'], varargs=None, keywords=None, defaults=None)
As suggested in comments, you can use the decorator module or you can use eval
evil powers to create a lambda function with correct signature:
import inspect
def identity_decorator(wrapped):
argspec = inspect.getargspec(wrapped)
args = inspect.formatargspec(*argspec)
def wrapper(*args, **kwargs):
return wrapped(*args, **kwargs)
func = eval('lambda %s: wrapper%s' % (args.strip('()'), args), locals())
return func
@identity_decorator
def foo(a):
pass
This is kinda hackish, but it preserves function arguments:
>>> inspect.getargspec(foo)
ArgSpec(args=['a'], varargs=None, keywords=None, defaults=None)