如何为sphinx文档保存修饰类的docstring?

2024-04-26 10:40:26 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

现在我想在另一个模块中用这个decorator装饰Foo类,并在装饰前为Foo类生成sphinx文档。看起来是这样的:

from .bar import decorator


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

我试图通过使用autoclass功能来实现这一点,但没有成功。我想做的是创建一个类实例并获取其docstring:

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

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

我希望在编写baz模块文档时,能够在Foo类的装饰之前生成它的文档。有可能吗?你知道吗

编辑:

This看起来是一个类似的问题,但这里我想实现的是将Sphinx将看到的docstring传递给Wrapper实例,并基于原始的Foodocstring生成一个文档,或者我将能够调用Wrapper.original并对此进行文档编制,但以下操作没有成功:

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

Tags: 文档selfpackageobjectfoodef装饰decorator
1条回答
网友
1楼 · 发布于 2024-04-26 10:40:26

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

'The docstring I want to preserve.'

相关问题 更多 >