If I do the following
def mydecorator(f):
def wrapper(*args, **kwargs):
f(*args, **kwargs)
wrapper.__doc__ = f.__doc__
wrapper.__name__ = f.__name__
return wrapper
@mydecorator
def myfunction(a,b,c):
'''My docstring'''
pass
And then type help myfunction
, I get:
Help on function myfunction in module __main__:
myfunction(*args, **kwargs)
My docstring
So the name and docstring are correctly copied over. Is there a way to also copy over the actual call signature, in this case (a, b, c)
?
Here is an example using Michele Simionato's decorator module to fix the signature:
import decorator
@decorator.decorator
def mydecorator(f,*args, **kwargs):
return f(*args, **kwargs)
@mydecorator
def myfunction(a,b,c):
'''My docstring'''
pass
help(myfunction)
# Help on function myfunction in module __main__:
# myfunction(a, b, c)
# My docstring
Try the decorator
module, available here: http://pypi.python.org/pypi/decorator/3.2.0
Relevant portion of the docs: http://micheles.googlecode.com/hg/decorator/documentation.html#statement-of-the-problem
This functionality is supplied by the Python standard library's inspect module, specifically by inspect.getargspec.
>>> import inspect
>>> def f(a, b, c=0, *args, **kwargs): return
...
>>> inspect.getargspec(f)
ArgSpec(args=['a', 'b', 'c'], varargs='args', keywords='kwargs', defaults=(0,))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With