如何模拟导入以阅读文档?

Bri*_*lee 7 python mocking read-the-docs

问题:

我一直在与Read the Docs斗争。导入的模块与 I/O 交互,因此文档不包含任何文本。 但是构建不会失败。

尝试的解决方案:

我正在尝试在 doc/conf.py 中使用mockMagicMock但它不起作用。

所需的解决方案

基本上,我想mock整个导入。所以RTD并没有尝试运行任何代码。只需从 DocStrings 生成文档。

我只是想要一个模块的mock 所有元素。在函数变量任何带有 DocString 的东西。

目前我必须在 virtualenv 中安装项目,以满足导入。如果没有必要,我想避免这种情况。现在......如果我不这样做,那么文档也不包含任何文本。 同样,构建不会失败。

细节

例子.py

"""Basic DocSting Comments"""
from external.module import *

foo = module()
foo.connect()
"""
I want this to show up in RTD.
"""
Run Code Online (Sandbox Code Playgroud)

我的具体案例可以在这里找到。

文档/conf.py

from mock import MagicMock

MOCK_MODULES = ['external.module', 'eternal.module.module', 'external.module.module.connect']
for mod_name in MOCK_MODULES:
    sys.modules[mod_name] = MagicMock()
Run Code Online (Sandbox Code Playgroud)

我尝试了十几种不同的东西,但没有运气。使用mockMagicMockadvanced settings在 RTD 中不同。 一切都没有运气。

一个丑陋的黑客:

我确实遇到了一个丑陋的黑客。但它违背了使用 DocStrings 的目的。再次编写代码以便 RTD 可以捕获 DocStings,不妨将其编写在单独的文档中。

if __name__ == "__main__":
    this = foo.connect()
    """
    This is where the real DocStrings go.
    """
else:
    this = 'this is the connect'
    """
    This is where the RTD DocStrings would go
    """
Run Code Online (Sandbox Code Playgroud)

我不想以两倍的代码结束,只是为了添加一些文档。

MySQL 连接器/Python

我还想将它与 MySQL 连接器一起使用。由于 RTD 在遇到此包时也会中断。我不能用requirements.txt.

import mysql.connector as db

db_connection = db.connect(**my_config)
"""
Perhaps I want to include some details here.
"""
Run Code Online (Sandbox Code Playgroud)

Eri*_*ner 1

我在这篇博客文章中找到的以下解决方案对我有用。我想嘲笑open3d,并且可以通过以下方式做到这一点:

from unittest import mock

# Mock open3d because it fails to build in readthedocs
MOCK_MODULES = ["open3d"]
for mod_name in MOCK_MODULES:
    sys.modules[mod_name] = mock.Mock()
Run Code Online (Sandbox Code Playgroud)

请注意,您需要导入mockfrom因为unittest.mock是从Python 3.3(源代码unittest)开始的内置模块。

如果你想模拟多个包,你可以这样做:

from unittest import mock

# Mock open3d because it fails to build in readthedocs
MOCK_MODULES = ["open3d", "numpy", "matplotlib", "matplotlib.pyplot"]
for mod_name in MOCK_MODULES:
    sys.modules[mod_name] = mock.Mock()
Run Code Online (Sandbox Code Playgroud)