Как сохранить документацию украшенного класса для документации сфинкса? - PullRequest
3 голосов
/ 11 апреля 2019

У меня есть декоратор, который имеет вложенное определение класса упаковки.Оболочка поддерживает в качестве атрибута исходный класс, который она оборачивает.Пример игрушки выглядит следующим образом:

def decorator(cls):
    class Wrapper(object):
        original = cls

        def __init__(self):
            self.__doc__ = self.original.__doc__
            self.__name__ = self.original.__name__

        def do_something_with_cls(cls):
            pass

    return Wrapper

Теперь я хочу украсить класс Foo с помощью этого декоратора в другом модуле и сгенерировать документацию sphinx для класса Foo до его оформления.Это выглядит так:

from .bar import decorator


@decorator
class Foo(object):
    """The docstring I want to preserve."""
    def __init__(self):
        pass

Я пытался добиться этого с использованием функциональности autoclass, но это не сработало.Я хотел создать экземпляр класса и взять его строку документации:

.. autoclass:: package.baz.Foo()
   :members:

, но он вернул это в html-документации класса package.baz.Foo: alias of package.bar.decorator.<locals>.Wrapper

Iхочу достичь этого, когда я документирую модуль baz, я могу сгенерировать документацию класса Foo до его оформления.Возможно ли это?

РЕДАКТИРОВАТЬ:

Это выглядит как аналогичная проблема, но здесь я хотел бы добиться, чтобы передать экземпляру Wrapper строку документации, котораяSphinx увидит и сгенерирует документацию на основе исходной строки документации Foo, или я смогу вызвать Wrapper.original и составить документацию по этому вопросу, но следующее не сработало:

.. autoclass package.baz.Foo.original
   :members:

1 Ответ

3 голосов
/ 11 апреля 2019

Если @wraps не работает, вы можете обновить __doc__ вручную.

Сделайте что-то вроде:

def decorator(cls):
    class Wrapper(object):
        original = cls

        def __init__(self):
            self.__doc__ = self.original.__doc__
            self.__name__ = self.original.__name__

        def do_something_with_cls(cls):
            pass

    Wrapper.__doc__ = cls.__doc__
    return Wrapper


@decorator
class Foo(object):
    """The docstring I want to preserve."""
    def __init__(self):
        pass


print(Foo.__doc__)

'Строка документации, которую я хочу сохранить.'

...