Почему sphinx autodoc выводит строку документации декоратора, когда в методе есть два декоратора?

С помощью sphinx autodoc я хочу создать документацию для метода, который имеет @classproperty а также @classmethod декораторы. Вместо документации метода я получаю @classmethodДокументация. Если я удаляю один из декораторов, все работает правильно. Код класса структурирован, как показано ниже:

class Example(object):
    @classproperty
    @classmethod
    def example_method(cls):
       """Method description"""
       pass

Класс имущества, декоратор:

class classproperty(property):
    def __get__(self, obj, type=None):
        return self.fget.__get__(None, type)()

И я генерирую документацию, используя:

.. autoclass:: Example
    :members:

0 ответов

Из документации Сфинкса,

Заметка

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

Начиная с Python 2.5, functools.wraps() можно использовать для создания хорошо оформленных функций декорирования.

Так что я думаю, что проблема в том, что ваш декоратор отбрасывает строку документации, когда оборачивает функцию. wraps должен быть в состоянии помочь с этим.

Вы можете следовать шаблону из документации Python по этому вопросу. Для вашего случая использования вы можете сделать:

from functools import wraps

def classpropertymethod(f):
    @wraps(f)
    def wrapper(*args, **kwargs):
        return classproperty(classmethod(f(*args, **kwargs)))
    return wrapper

@classpropertymethod
def example_method(cls):
    """Method description"""
    pass

Это должно получить документацию от example_method прошло правильно.

Другие вопросы по тегам