简而言之,我有一些代码可以工作,但如果我稍微调整一下,有些东西就会崩溃,我似乎不知道为什么。我希望有比我更有经验的人能给我一些狮身人面像的指点。我已经搜索过了,以前没有看到过类似这期的帖子。
有用的东西
我有一个包含模块mod
的包my_pkg
,该模块包含许多类和函数。
如果我在conf.py
中使用以下行
sys.path.insert(0, os.path.abspath('../my_pkg'))
我的一个.rst文件包含以下
.. automodule:: mod
.. autoclass:: mod.classA
:members:
.. autofunction:: mod.functionA
.. autoclass:: mod.classB
:members:
然后当我运行我的文档时,一切都正常!然而,这些将输出文档中的调用签名呈现为mod.classA(例如(,我更希望它们呈现为my_pkg.mod.classA.
不起作用的东西要进行此更改,我认为应该像一样从conf.py
中删除pkg
sys.path.insert(0, os.path.abspath('../my_pkg'))
然后更改我的.rst文件,从pkg开始如下所示:
.. automodule:: my_pkg.mod
.. autoclass:: my_pkg.mod.classA
:members:
.. autofunction:: my_pkg.mod.functionA
.. autoclass:: my_pkg.mod.classB
:members:
如果我这样做,automodule指令不会接收任何内容,因此不会显示我的模块的文档字符串(我没有收到任何关于autodoc无法找到pkg.mod的警告,所以我觉得这很奇怪(。的输出
.. autoclass:: my_pkg.mod.classA
:members:
简称alias of my_pkg.mod.
。。。尽管这是错误的。尽管如此;源";类签名中的按钮正确地链接到该类的代码。最后,剩下的函数和类按照我希望的方式进行渲染。看来Sphinx出于某种原因真的不想记录这个模块或classA。
这个问题把我逼疯了。它涉及多个主题,所以我相信这是一个狮身人面像问题。我已经尝试将classA的文档字符串更改为""quot;foo"";。我试着在文档中移动classA,这样它就不是真正的代码的第一部分。我试过重命名classA。似乎没有什么能解决它,而A类总是个问题。
有人知道为什么会发生这种事吗?我使用的是斯芬克斯v4.1.1和斯芬克斯rtd主题v0.5.2(这两个版本在本文发布时都是最新版本(。
您可能需要为类/函数定义__module__
属性,如另一篇Stack Overflow文章中所述。
Edit:我最初的想法是完全错误的,但现在我已经能够多次重现这个问题。mzjn是正确的,我没有提供足够的上下文。
这个问题似乎是由my_pkg
是一个模拟导入引起的。在conf.py
中,我有一条线路
autodoc_mock_imports = ['my_pkg', 'numpy', 'scipy', 'pandas']
我的发现是,如果我试图从包根开始进行文档记录(即my_pkg
是automodule和autoclass的第一个参数,如不起作用的部分所述(,而my_pkg
是一个模拟导入,Sphinx会导致我上面描述的问题。在更改结构时,我忘记了从mock导入中删除my_pkg
(这仍然不能真正解释为什么存在这种行为,但至少我找到了如何复制它(。