如何创建仅在__init__中声明的Python / Sphinx文档对象属性?

时间:2010-10-18 13:25:50

标签: python documentation attributes python-sphinx docstring

我有带有对象属性的Python类,它们只被声明为运行构造函数的一部分,如下所示:

class Foo(object):
    def __init__(self, base):
        self.basepath = base

        temp = []
        for run in os.listdir(self.basepath):
            if self.foo(run):
                temp.append(run)
        self.availableruns = tuple(sorted(temp))

如果我现在使用help(Foo)或尝试在Sphinx中记录Foo,则不会显示self.basepathself.availableruns属性。这对我们API的用户来说是一个问题。

我已经尝试了一种标准的方法来确保解析器可以找到这些“动态声明的”属性(最好是docstring'd),但到目前为止还没有运气。有什么建议?感谢。

2 个答案:

答案 0 :(得分:8)

  

我已经尝试了一种标准的方法来确保解析器可以找到这些“动态声明的”属性(最好是docstring'd),但到目前为止还没有运气。有什么建议?

任何解析器都无法“检测”它们。

Python有setattr。在任何意义上,完整的属性集都不会“可检测”。

您绝对必须在docstring中描述它们。

[除非你想做一堆元编程,以便从你从inspect或其他东西收集的东西中生成文档字符串。即使这样,一旦开始使用setattr,您的“解决方案”就会不完整。]

class Foo(object):
    """
    :ivar basepath:
    :ivar availableruns:
    """
    def __init__(self, base):

答案 1 :(得分:2)

您可以定义一个与实例变量同名的类变量。然后,当您设置它时,该类变量将被实例变量遮蔽。 E.g:

class Foo(object):
     #: Doc comment for availableruns
     availableruns = ()

    def __init__(self, base):
        ...
        self.availableruns = tuple(sorted(temp))

实际上,如果实例变量有一个有用的不可变默认值(例如None或空元组),那么你可以通过不设置变量来节省一点内存,如果它应该有它的默认值。当然,如果您正在讨论可能要删除的实例变量(例如del foo.availableruns),这种方法将无效 - 但我发现这不是一个非常常见的情况。

如果你正在使用sphinx并设置了“autoattribute”,那么应该适当地记录下来。或者,根据您正在做的事情的上下文,您可以直接使用Sphinx .. py:attribute::指令。