如何为狮身人面像文档保留修饰类的文档字符串?

时间:2019-04-11 18:26:10

标签: python python-sphinx python-decorators docstring

我有一个装饰器,该装饰器具有包装类的嵌套定义。 包装器将包装的原始类保留为属性。 玩具示例如下:

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类的HTML文档中返回了此值:alias of package.bar.decorator.<locals>.Wrapper

我想实现的是,在编写baz模块时,我能够在装饰Foo类之前生成一个文档。有可能吗?

编辑:

This似乎是一个类似的问题,但是我想实现的是将Sphinx将看到的文档字符串传递给Wrapper实例,并基于原始的{{1} } docstring,否则我将可以调用Foo并为此做一个文档,但以下内容无法解决:

Wrapper.original

1 个答案:

答案 0 :(得分: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__)
  

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