我正在阅读Sphinx文档页面时,讽刺的是我发现有关var、ivar和cvar之间区别的文档非常缺乏。我想知道是否有人能够解释内联代码中每个不同命名空间之间的区别。
示例:
class foo(object):
"""
:var str first:
:ivar str last:
:cvar str middle:
"""
这些sphinx标签各自有何不同,我应该如何知道哪一个是正确的,并按设计使用它们?
我正在阅读Sphinx文档页面时,讽刺的是我发现有关var、ivar和cvar之间区别的文档非常缺乏。我想知道是否有人能够解释内联代码中每个不同命名空间之间的区别。
示例:
class foo(object):
"""
:var str first:
:ivar str last:
:cvar str middle:
"""
这些sphinx标签各自有何不同,我应该如何知道哪一个是正确的,并按设计使用它们?
var
是一个通用变量。当你记录文档时,如果你不想对变量做进一步的区分,就可以使用它。
ivar
是指"实例变量",即在实例对象上设置的变量(类的实例)。通常情况下,这些会在__init__
方法中(在Python中)定义。
cvar
是指"类变量",即直接在类对象上设置的变量。通常情况下,这些会在类语句中设置,但在类的任何特定方法之外。
以下是一个示例:
class SomeClass(object):
cvar = 'I am a class variable'
def __init__(self):
self.ivar = 'I am an instance variable'
文档
https://www.sphinx-doc.org/en/master/usage/restructuredtext/domains.html#info-field-lists 截至 Sphinx==6.1.3
目前表示它们都完全相同,这很遗憾:
在当前版本中,所有 var、ivar 和 cvar 都被表示为“变量”。没有任何区别。
:ivar:
vs :cvar
最小可运行示例
以下是一个最小可运行示例,显示它们可能被设计为如何使用以及输出的样子。截至 Sphinx==6.1.3
,它们没有渲染差异,因此对于源读取器来说只是语义上的问题,但无论如何也值得做。
因为我不确定何时使用,所以不显示:var:
!也许模块级变量是最好的选择?如何在Python中记录模块常量?但它在模块docstring中不起作用。
main.py
class MyOtherClass:
"""
This class does that.
"""
pass
class MyClass:
"""
Description for class.
:ivar var1: Doc for var1
:ivar var2: Doc for var2.
Another line!
:cvar class_var: Syntax also works for class variables.
"""
class_var: int
def __init__(self, par1: int, par2: MyOtherClass):
self.var1: int = par1
self.var2: MyOtherClass = par2
def method(self):
"""
My favorite method.
"""
pass
@classmethod
def cmethod():
"""
My favorite class method.
"""
pass
build.sh
sphinx-build . out
conf.py
import os
import sys
sys.path.insert(0, os.path.abspath('.'))
extensions = [ 'sphinx.ext.autodoc' ]
autodoc_default_options = {
'members': True,
}
autodoc_typehints = "description"
index.rst
.. automodule:: main
requirements.txt
Sphinx==6.1.3
在执行./build.sh
之后,out/index.html
下的输出如下所示:
#:
文档注释
这是另一种记录实例和类变量的方法。
目前两种方法之间存在权衡,遗憾的是没有一种明显优越的方法。
缺点:
优点:
两者都可以更好:
class_var
是类变量?TODO链接到功能请求除了self.var1 = par1 # Doc for var1
语法外,您还可以:
main.py
class MyClass:
"""
Description for class.
"""
#: Syntax also works for class variables.
class_var: int = 1
def __init__(self, par1: int, par2: MyOtherClass):
#: Doc for var1
self.var1: int = par1
#: Doc for var2.
#: Another line!
self.var2: MyOtherClass = par2
def method(self):
"""
My favorite method.
"""
pass
@classmethod
def cmethod():
"""
My favorite class method.
"""
pass
产生:
#:
语法的文档位于:https://www.sphinx-doc.org/en/master/usage/extensions/autodoc.html#directive-autoproperty
在 Python 3.10 和 Ubuntu 22.10 上进行了测试。
http://thomas-cokelaer.info/tutorials/sphinx/docstring_python.html
#:
中,非类变量var1
和var2
也遇到了同样的问题。我认为这个#:
输出方面比较劣(没有“变量”分组),与:ivar:
相比唯一的缺点就是这个,真是遗憾。 - Ciro Santilli OurBigBook.com