Sphinx-从父方法插入参数文档

发布于 2021-01-29 16:47:48

我有一些彼此继承的类。所有类都包含相同的方法(我们称它为mymethod),从而子级将覆盖基类方法。我想mymethod使用sphinx为所有类生成一个文档。

假设mymethod有一个论点myargument。对于基本方法和继承方法,此参数具有相同的类型和含义。为了最大程度地减少冗余,我myargument只想为基类编写文档,然后
文档 插入 子方法的文档中。也就是说,我不想只对基类进行简单引用,而是在生成文档时动态地插入文本。

能做到吗?怎么样?

请在下面找到一些说明问题的代码。

class BaseClass
    def mymethod(myargument):
        """This does something

        Params
        ------
        myargument : int
            Description of the argument

        """
        [...]


class MyClass1(BaseClass):
    def mymethod(myargument):
        """This does something

        Params
        ------
        [here I would like to insert in the description of ``myargument`` from ``BaseClass.mymethod``]
        """

        BaseClass.mymethod(myargument)
        [...]

class MyClass2(BaseClass):
    def mymethod(myargument, argument2):
        """This does something

        Params
        ------
        [here I would like to insert in the description of ``myargument`` in ``BaseClass.mymethod``]
        argument2 : int
            Description of the additional argument

        """

        BaseClass.mymethod(argument)
        [...]
关注者
0
被浏览
137
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    可能不太理想,但也许您可以使用装饰器来扩展文档字符串。例如:

    class extend_docstring:
        def __init__(self, method):
            self.doc = method.__doc__
    
        def __call__(self, function):
            if self.doc is not None:
                doc = function.__doc__
                function.__doc__ = self.doc
                if doc is not None:
                    function.__doc__ += doc
            return function
    
    
    class BaseClass:
        def mymethod(myargument):
            """This does something
    
            Params
            ------
            myargument : int
                Description of the argument
            """
            [...]
    
    
    class MyClass1(BaseClass):
        @extend_docstring(BaseClass.mymethod)
        def mymethod(myargument):
            BaseClass.mymethod(myargument)
            [...]
    
    class MyClass2(BaseClass):
        @extend_docstring(MyClass1.mymethod)
        def mymethod(myargument, argument2):
            """argument2 : int
                Description of the additional argument
            """
    
            BaseClass.mymethod(argument)
            [...]
    
    
    print('---BaseClass.mymethod---')
    print(BaseClass.mymethod.__doc__)
    print('---MyClass1.mymethod---')
    print(MyClass1.mymethod.__doc__)
    print('---MyClass2.mymethod---')
    print(MyClass2.mymethod.__doc__)
    

    结果:

    ---BaseClass.mymethod---
    This does something
    
            Params
            ------
            myargument : int
                Description of the argument
    
    ---MyClass1.mymethod---
    This does something
    
            Params
            ------
            myargument : int
                Description of the argument
    
    ---MyClass2.mymethod---
    This does something
    
            Params
            ------
            myargument : int
                Description of the argument
            argument2 : int
                Description of the additional argument
    

    如果将装饰器作为描述符并搜索到该覆盖器,则可以动态解析覆盖方法,__get__但这意味着装饰器不再可堆叠,因为它不返回实函数。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看