Sphinx-从父方法插入参数文档 [英] Sphinx - insert argument documentation from parent method
问题描述
我有一些彼此继承的类.所有类都包含相同的方法(我们称其为mymethod
),由此子级将覆盖基类方法.我想使用 sphinx mymethod的文档>.
I have some classes that inherit from each other. All classes contain the same method (let us call it mymethod
), whereby the children overwrite the base class method. I want to generate a documentation for mymethod
in all classes using sphinx.
假设mymethod
接受参数myargument
.对于基本方法和继承方法,此参数都具有相同的类型和含义.为了最大程度地减少冗余,我只想为基类编写myargument
的文档,并在子方法的文档中编写插入的文档.也就是说,我不想只对基类进行简单的引用,而是在生成文档时动态地插入文本.
Suppose mymethod
takes an argument myargument
. This argument has the same type and meaning for both the base method as well as the inherited method. To minimize redundancies, I would like to write the documentation for myargument
only for the base class and insert the documentation in the child method's documentation. That is, I do not want to only put a simple reference to the base class but rather dynamically insert the text when I generate the documentation.
可以做到吗?怎么样?
请在下面找到一些说明问题的代码.
Below please find some code illustrating the problem.
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)
[...]
推荐答案
可能不太理想,但是也许可以使用修饰符来扩展文档字符串.例如:
Probably not ideal, but maybe you could use a decorator to extend the docstring. For example:
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__
,则可以动态解析重写方法,但这意味着装饰器不再可堆叠,因为它不返回真实函数.
The override method could be resolved dynamically if you make the decorator a descriptor and search for it into __get__
but that means the decorator is no longer stackable as it doesn't return the real function.
这篇关于Sphinx-从父方法插入参数文档的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!