在 python 中模拟子模块

Mocking submodules in python

我正在尝试通过 sphinx 为我的项目生成自动文档。但是,我将 运行 在没有我正在导入的所有模块的环境中生成自动文档。因此我想模拟导入语句。

http://read-the-docs.readthedocs.io/en/latest/faq.html 我发现了这个 C 模块的技巧:

import sys
from unittest.mock import MagicMock

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

MOCK_MODULES = ['pygtk', 'gtk', 'gobject', 'argparse', 'numpy', 'pandas']
sys.modules.update((mod_name, Mock()) for mod_name in MOCK_MODULES)

然而模拟 getattr 并不能解决像这样的情况:

from foo.bar import blah

也就是当import语句中涉及到一个点[.]的时候。

有人知道如何为特定的模块列表模拟我的所有导入吗?

导入

from foo.bar import blah

将寻找 sys.modules['foo.bar']。只需插入:

>>> from foo.bar import blah
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'foo'
>>> import sys
>>> from unittest import mock
>>> sys.modules['foo.bar'] = mock.Mock()
>>> from foo.bar import blah
>>> blah
<Mock name='mock.blah' id='4362289896'>