Если я сделаю следующее

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

И затем введите help myfunction, я получаю:

Help on function myfunction in module __main__:

myfunction(*args, **kwargs)
    My docstring

Таким образом, имя и строка документа правильно скопированы. Есть ли способ также скопировать фактическую подпись вызова, в этом случае (a, b, c)?

11
astrofrog 6 Июн 2010 в 07:10

3 ответа

Лучший ответ

Вот пример использования модуля декоратора Мишеля Симионато для исправления подписи:

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
9
unutbu 8 Июн 2010 в 12:57

Эта функциональность предоставляется модулем проверки стандартной библиотеки Python, в частности 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,))
1
Jordan Lewis 6 Июн 2010 в 03:47

Попробуйте модуль decorator, доступный здесь: http: //pypi.python. орг / PyPI / декоратор / 3.2.0

Соответствующая часть документов: http: // micheles. googlecode.com/hg/decorator/documentation.html#statement-of-the-problem

3
Arkady 6 Июн 2010 в 03:49