Получение сфинкса для отображения параметров функции в оболочке с декоратором

Я использую sphinx для документирования проекта, и у меня проблемы с функциями, заключенными в декораторы. Я видел похожие вопросы, но мне кажется, что нет решения, подходящего для моей проблемы

У меня есть сотни функций, заключенных в специальный декоратор, который сам может принимать параметры.

from functools import wraps

def CustomFunctionDecorator(id, name):
    """Custom decorator"""
    def outer(f):

        @wraps(f)
        def inner(*args, **kwargs):
            ...do stuff....
            f(*args, **kwargs)

        return inner

    return outer

Тогда моя функция будет выглядеть так

@CustomFunctionDecorator(123, 'Test')
def TestFunction(a, b, c=None):
    """Test Documentation"""
    ..do something....

Теперь, когда я использую sphinx и autodoc для создания своей документации, все мои функции, заключенные в CustomFunctionDecorator, скрывают фактические аргументы функции в документации sphinx и выглядят следующим образом

TestFunction(*args, **kwargs)

Тестовая документация

Документация работает, но параметры функции - нет ....

Любые идеи? надеюсь, я ясно выразился


person Dale    schedule 03.08.2014    source источник


Ответы (1)


Согласно этому ответу:

functools.wraps сохраняет только __name__, __doc__ и __module__. Чтобы также сохранить подпись, обратите внимание на модуль Decorator Микеле Симионато.

Это обходной путь, а не исправление, но согласно документации (выделено мной):

Можно переопределить сигнатуру для явно задокументированных вызываемых объектов (функций, методов, классов) с помощью обычного синтаксиса, который переопределит сигнатуру, полученную в результате интроспекции:

.. autoclass:: Noodle(type)

   .. automethod:: eat(persona)  

Это полезно, если подпись метода скрыта декоратором.

Новое в версии 0.4

Очевидно, это не повлечет за собой "сотни функций" ...

person jonrsharpe    schedule 03.08.2014
comment
Спасибо за ответ. Я не совсем понимаю синтаксис автометода из примера. что такое есть и что такое персона с точки зрения кода? - person Dale; 04.08.2014
comment
eat - это имя метода, persona - имя параметра. - person jonrsharpe; 04.08.2014
comment
хорошо, так что в основном это означало бы, что мне нужно добавить, что для каждой из моих функций, завернутых в мой декоратор, sphinx скрывает - person Dale; 04.08.2014
comment
Это один из вариантов, да. - person jonrsharpe; 04.08.2014