如何为sphinx文档保留装饰类的文档字符串?

问题描述 投票:3回答:1

我有一个装饰器,它有一个包装类的嵌套定义。包装器将其包装的原始类维护为属性。玩具示例如下所示:

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类,并在装饰之前为Foo类生成sphinx文档。它看起来像这样:

from .bar import decorator


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

我试图通过使用autoclass功能实现这一目标,但它没有成功。我想要做的是创建一个类实例并获取其文档字符串:

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

但它在package.baz.Foo类的qtml文档中返回了这个:alias of package.bar.decorator.<locals>.Wrapper

我想要实现这一点,当我记录baz模块时,我能够在装饰之前生成Foo类的文档。可能吗?

编辑:

This看起来像一个类似的问题,但在这里我想要实现的是传递给Wrapper实例的Sphinx将看到的文档字符串并生成基于原始Foo文档字符串的文档或者我将能够调用Wrapper.original并制作文档这个,但以下没有成功:

.. autoclass package.baz.Foo.original
   :members:
python python-sphinx python-decorators docstring
1个回答
3
投票

如果@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__)

“我想保留的文档字符串。”

© www.soinside.com 2019 - 2024. All rights reserved.