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

2024-06-26 10:53:03 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 对象runself声明forbase属性object
2条回答

I've tried searching for a standard way to ensure that these "dynamically declared" attributes can be found (and preferably docstring'd) by the parser, but no luck so far. Any suggestions?

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

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

你必须在文档字符串中描述它们。

[除非你想做一堆元编程,从你从inspect或其他地方收集的东西中生成docstring。即使如此,只要您开始使用setattr,您的“解决方案”也将是不完整的

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

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

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

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

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

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

相关问题 更多 >