Sphinx autodoc使用模拟卡在random.choice()上 [英] Sphinx autodoc gets stuck on random.choice() using mock
问题描述
This is a continuation of a question I originally asked in this post: random.choice error due to np.linspace and np.logspace
在这个问题中,我将问题简化到最低限度,并且能够重现Sphinx挂在random.choice()函数上的问题.
In this question, I have stripped down the problem to the bare minimum and was able to reproduce the problem where Sphinx is hanging up on the random.choice() function.
这是文件randor_test.py中的Python代码;它在PyCharm中运行:
Here is the Python code in the file randor_test.py; it runs in PyCharm:
import random
import numpy as np
def rand_test(svr_C, svr_gamma):
"""This is test docstring
#. item one
#. item two
"""
ml_params = {'C': random.choice(svr_C), 'gamma': random.choice(svr_gamma)}
return ml_params
svr_C = list(np.linspace(50, 300, 10))
svr_gamma = list(np.logspace(-4, -2, 3))
rand_result = rand_test(svr_C, svr_gamma)
for i in rand_result:
print(i, rand_result[i])
我设置了Sphinx目录,并按照这篇文章中的所有说明进行操作:
I set up the Sphinx directory and followed all instructions in this post: Getting Started with Sphinx...
运行make html
后,出现以下错误:
After running make html
I receive the following error:
WARNING: autodoc: failed to import module 'randor_test'; the following exception was raised:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sphinx/ext/autodoc/importer.py", line 32, in import_module
return importlib.import_module(modname)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 728, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/Users/kellihed/PAC_projects/basic_0629/src/randor_test.py", line 19, in <module>
rand_result = rand_test(svr_C, svr_gamma)
File "/Users/kellihed/PAC_projects/basic_0629/src/randor_test.py", line 10, in rand_test
ml_params = {'C': random.choice(svr_C), 'gamma': random.choice(svr_gamma)}
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/random.py", line 261, in choice
raise IndexError('Cannot choose from an empty sequence') from None
IndexError: Cannot choose from an empty sequence
我的文件结构遵循建议的布局:
My file structure follows the suggested layout:
|--docs
| |
| |--Makefile
| |--build
| | |
| | |--doctrees
| | |--html
| | |--_static
| | |--genindex.html
| | |--index.html
| | |--modules.html
| |--make.bat
| |--source
| |
| |--_static
| |--_templates
| |--conf.py
| |--index.rst
| |--modules.rst
| |--randor_test.rst
|
|--src
| |__pychache__
| | |
| | |--randor_test.cpython-37.pyc
| |
| |--randor_test.py
我在conf.py中有以下忽略导入语句:
I have the following ignore imports statement in conf.py:
autodoc_mock_imports = ["random", "numpy"]
下面是我的conf.py文件:
Below is my conf.py file:
# -- Path setup --------------------------------------------------------------
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
import os
import sys
sys.path.insert(0, os.path.abspath(os.path.join('..', '..', 'src')))
# -- Project information -----------------------------------------------------
project = 'random_test'
copyright = '2020, DK'
author = 'DK'
# The full version, including alpha/beta/rc tags
release = '0.1'
# -- General configuration ---------------------------------------------------
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = ['sphinx.ext.autodoc']
autodoc_mock_imports = ["random", "numpy"]
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This pattern also affects html_static_path and html_extra_path.
exclude_patterns = []
# -- Options for HTML output -------------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
html_theme = 'alabaster'
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
推荐答案
您具有在Sphinx导入randor_test
时将始终执行的模块级代码. svr_C = list(np.linspace(50, 300, 10))
不会直接导致错误,但是结果是svr_C
是一个空列表.
You have module-level code that will always be executed when Sphinx imports randor_test
. svr_C = list(np.linspace(50, 300, 10))
will not cause an error directly, but the result is that svr_C
is an an empty list.
执行random.choice(svr_C)
时发生错误.我认为autodoc_mock_imports
中的random
不会有任何区别(它是始终可用的内置标准模块).我认为最好的解决方案是将模块级代码放在if __name__ == '__main__'
块中.
The error occurs when random.choice(svr_C)
is executed. I don't think having random
in autodoc_mock_imports
makes any difference (it is a built-in standard module that is always available). I think the best solution is to put the module-level code in a if __name__ == '__main__'
block.
另请参见 sphinx是否在执行"make html"时运行我的代码?.
这篇关于Sphinx autodoc使用模拟卡在random.choice()上的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!