将Sphinx autodoc-skip-member连接到我的函数

时间:2010-09-21 05:22:08

标签: python python-sphinx

我想使用sphinx's autodoc-skip-member事件来选择某个python类中的一部分成员来获取文档。

但是从sphinx文档中不清楚,我找不到任何说明的例子:我在哪里放置代码来连接它?我看到Sphinx.connect并且我怀疑它出现在我的conf.py中,但是当我在conf.py中尝试使用此代码的变体时,我找不到应该连接的应用程序对象():

def maybe_skip_member(app, what, name, obj, skip,
                                  options):
    print app, what, name, obj, skip, options
    return False

# This is not even close to correct:
#from sphinx.application import Sphinx
#Sphinx().connect('autodoc-skip-member', maybe_skip_member)

指向一个简单示例的指针是理想的。

3 个答案:

答案 0 :(得分:41)

啊哈,最后一次用谷歌搜索的努力转向this example,向下滚动到底部。显然,conf.py中的setup()函数将通过app调用。我能够在conf.py的底部定义以下内容:

def maybe_skip_member(app, what, name, obj, skip, options):
    print app, what, name, obj, skip, options
    return True

def setup(app):
    app.connect('autodoc-skip-member', maybe_skip_member)

这显然是无用的(它会跳过所有内容),但这是我寻找的最小例子,却找不到......

答案 1 :(得分:11)

这个答案扩展到answer by bstpierre。以下是我conf.py的相关部分:

autodoc_default_flags = ['members', 'private-members', 'special-members',
                         #'undoc-members',
                         'show-inheritance']

def autodoc_skip_member(app, what, name, obj, skip, options):
    exclusions = ('__weakref__',  # special-members
                  '__doc__', '__module__', '__dict__',  # undoc-members
                  )
    exclude = name in exclusions
    return skip or exclude

def setup(app):
    app.connect('autodoc-skip-member', autodoc_skip_member)

答案 2 :(得分:2)

如果有人来搜索相同的问题,但使用的是 AutoAPI 而不是 autodoc,下面的代码段成功地从 AutoAPI 生成的文档中排除了以 _ 开头的所有属性和方法;这在实践中并不是一个好主意,但我想从一些非常容易检测的东西开始。

def autoapi_skip_member(app, what, name, obj, skip, options):
    """Exclude all private attributes, methods, and dunder methods from Sphinx."""
    import re
    exclude = re.findall('\._.*', str(obj))
    return skip or exclude


def setup(app):
    """Add autoapi-skip-member."""
    app.connect('autoapi-skip-member', autoapi_skip_member)

要指出的一个怪癖/奇怪的是,在 name 函数中应用于 str(obj) 而不是 autoapi_skip_member 的相同函数似乎不起作用,而我(显然) 错误地认为是同一件事(根据 AutoAPI 文档为“fully qualified name of the object”)。

这包括在抛出类似以下内容以检测以 _ 开头的方法时:

or (hasattr(obj, '__name__') and str(obj.__name__).startswith('_'))