自动文档生成工具与显式指定的实例属性存在问题

7

我编写了一个Python类,并使用Sphinx制作了文档。例如,该类如下:

class Aclass(object):
    """ my class """

    def __init__(self):
        """ constructor """

        self.a = None
        """ doc for attribute a """

        self._prop = None

    def _get_prop(self):
        """ getter prop """
        return self._prop

    def _set_prop(self, val):
        """ setter prop """
        self._prop = val

    prop = property(_get_prop, _set_prop)
    """ a property """

    def square(self):
        """ return square of a """
        return self.a**2

现在,为了进行文档编写,在rst文件中我写下了以下内容:
.. autoclass:: aclass.Aclass
   :members:

一切都没问题,文档中出现了apropsquare

enter image description here

但是如果我尝试单独记录属性和方法,sphinx会提示找不到属性a,但对于prop却可以。

.. autoattribute:: aclass.Aclass.prop

.. autoattribute:: aclass.Aclass.a

错误信息为:
Traceback (most recent call last):                                                                                
  File "/usr/lib/python2.7/dist-packages/sphinx/ext/autodoc.py", line 326, in import_object
    obj = self.get_attr(obj, part)
  File "/usr/lib/python2.7/dist-packages/sphinx/ext/autodoc.py", line 232, in get_attr
    return safe_getattr(obj, name, *defargs)
  File "/usr/lib/python2.7/dist-packages/sphinx/util/inspect.py", line 70, in safe_getattr
    raise AttributeError(name)
AttributeError: a

/home/gvallver/dev/sphinx/doc/source/index.rst:17: WARNING: autodoc can't import/find attribute 'aclass.Aclass.a', it reported error: "a", please check your spelling and sys.path

我在某个地方读到了一篇关于Sphinx的文章《Sphinx values for attributes reported as None》,其中提到sphinx不会实例化类,因此类属性(作为prop)和实例属性(作为a)之间存在差异。但是我该如何在文档中引用实例属性呢?
实际上,如果在rst文件中没有明确要求,实例属性也会被找到。例如,以下代码可以正常工作:
.. autoclass:: aclass.Aclass
    :members:

但这并不是

.. autoclass: aclass.Aclass
    :members: a

S.Lott的解决方案在这里提供了一个额外的解决方法:https://dev59.com/Hm865IYBdhLWcg3wKLNP - ecoe
1个回答

4

有一个关于这个问题的缺陷报告(创建于2012-03-30; 仍然开放,直到2015-12-12):https://github.com/sphinx-doc/sphinx/issues/904

  1. 明确包含实例属性的:members:列表的问题已在此提交中得到解决(包含在Sphinx 1.2b1中)。

  2. 正如Jon Waltman的评论所述,存在一个未记录的autoinstanceattribute指令。

    使用.. autoinstanceattribute:: aclass.Aclass.a可以工作(已在Sphinx 1.1.3和1.2b1中测试)。


似乎 autoinstanceattribute 不再起作用了:我收到了 WARNING: Unknown directive type "autoinstanceattribute". 的警告。 - Gordon Bai
@GordonBai:错误报告已于2020年7月16日关闭。autoattribute是否有效? - mzjn
有一个问题评论提到autoattribute指令会为实例属性引发AttributeError。然后评论者通过PR修复了该问题。但是,在我的测试中它仍然引发AttributeError。我正在使用Sphinx 4.0.2 - Gordon Bai
2
@GordonBai:autoinstanceattribute不再起作用,但在Sphinx 4.1.0中应该可以使用autoattribute。请参见https://github.com/sphinx-doc/sphinx/issues/9283。 - mzjn
@mjzn 谢谢!是的,我知道那个问题,因为它是由我提出的 :) - Gordon Bai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接