繁体   English   中英

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

[英]How can I make Python/Sphinx document object attributes only declared in __init__?

我有带有对象属性的 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),但到目前为止还没有运气。 有什么建议? 谢谢。

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

它们永远不会被任何解析器“检测到”。

Python 有setattr 从任何意义上说,完整的属性集永远是“不可检测的”。

您绝对必须在文档字符串中描述它们。

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

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

您可以定义一个与实例变量同名的类变量。 当您设置它时,该类变量将被实例变量隐藏。 例如:

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::指令。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM