sphinx autodoc跳过从mock继承的类

时间:2015-05-01 18:07:10

标签: python pyside python-sphinx

我使用sphinx来记录我的python项目,并且我有几个Qt / PySide小部件子类。因此,当我运行sphinx时,我需要模拟PySide,因为运行doc脚本的机器没有安装qt或pyside。 autodoc无法对这些子类做任何事情。

我尝试添加一个autodoc-skip-member函数,该函数检查对象是否是mock的实例并返回false,但仍然没有记录。不嘲笑和安装pyside解决了这个问题。

def skip(app, what, name, obj, skip, options):
    if isinstance(obj, unittest.mock.Mock):
        print('not skipping {0}'.format(name))
        return False
    return skip

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

我可以使用autodoc设置让它飞起来吗?

1 个答案:

答案 0 :(得分:0)

因此,在不需要额外扩展的情况下让sphinx飞行的主要解决方案就是模仿它们:

class Mock(MagicMock):
    @classmethod
    def __getattr__(cls, name):
        return Mock()


MOCKS = ['bar']
sys.modules.update((mod_name, Mock()) for mod_name in MOCKS)

示例here,sphinx autodoc模块使用similar approach。但是,如果尝试子类化这些模拟的导入,则继承实例化的类,而不是类本身,因为模块正在设置为实例。换到这个对我有用:

sys.modules.update((mod_name, Mock) for mod_name in MOCKS)

请注意它只是类Mock而不是实例Mock()。我不确定这有什么影响,但是因为它按预期工作