Sphinx python: autodoc 不导入在其他源文件中定义的 class 方法

Sphinx python: autodoc does not import class methods defined in other source files

在我的项目中,我在 energymodel.py 中定义了一个 class EnergyModel。还有generate_data class 从另一个源文件导入的方法:

#energy_model.py

from .energy_model_data_generation import generate_data
class EnergyModel(BaseEstimator):
    def __init__(...):
        EnergyModel.generate_data=generate_data

还有另一个定义方法的源文件:

#energy_model_data_generation.py

def generate_data(self, ...):
     ...

我将方法分成不同的源文件以保持文件足够小 - 这对我来说很方便。现在,我想用 Sphinx 生成 class 文档。我的 implementation.rst 如下:

Implementation
==============

.. _Energymodel_class:

Energymodel class
-----------------

.. autoclass:: neuralflow.EnergyModel
     :members:

其中 neuralflow 是包的名称(在 conf.py 中导入)。这不会为 generate_data 方法生成文档。我没有找到如何包含它,我只找到了如何交叉引用的方法,这不是我想要的。

编辑:在我的目录中也有__init__.py文件和源文件,所以它是一个包。它看起来像这样:

from .energy_model import EnergyModel
# Also import other modules/packages that are not part of EnergyModel class

__all__ = ['EnergyModel', ...(other stuff that are not part of EnergyModel)]

此外,我已将根目录添加到 conf.py 文件中的路径

问题是 generate_data() 方法是动态添加到构造函数中的 class 的。因为 Sphinx 从不调用构造函数(正如 @mzjn 指出的那样),所以当 Sphinx 构建文档时,此方法根本不是 class 的一部分。解决办法是在class层定义方法:

import energy_model_generation as emg

class EnergyModel(BaseEstimator):
    generate_data = emg.generate_data

更多的是 code-review 类型的注释,像这样在构造函数中动态创建方法并没有什么意义。方法应该只定义一次,但构造函数可以调用多次——class 的每个实例调用一次。很容易想象这是模糊错误的来源。