结合 doctest 和 Matplotlib Sphinx 扩展

fug*_*ede 6 python doctest matplotlib python-sphinx

Sphinx 扩展sphinx.ext.doctest可以轻松确保您的文档是最新的。同时,该matplotlib.sphinxext.plot_directive扩展使自动生成数字作为文档的一部分变得简单。

在我的情况下,我想结合两个扩展和

  1. 执行一些缓慢的计算,
  2. 使用 doctest 检查结果,
  3. 绘制结果。

也就是说,类似于下面的内容:

>>> import time
>>> def make_result():
...     time.sleep(100) 
...     return [3, 4]
>>> result = make_result()
>>> print(result)
[3, 4]

.. plot::

   >>> import matplotlib.pyplot as plt
   >>> plt.plot(result)
   >>> plt.show()
Run Code Online (Sandbox Code Playgroud)

就目前情况而言,这不太有效,因为绘图指令没有可用的前一个 doctest 块的上下文。此外,使用绘图指令的“上下文”选项似乎还不够,因为它消除了文档测试,并且意味着我将没有可用于未来非绘图指令块的上下文。

所以我的问题是:

将断言和绘图这两个操作结合起来的最佳方法是什么,同时仍然使断言作为 doctest 运行,并且无需运行缓慢的操作两次,并确保代码的 doctest 部分中设置的变量仍然可用文件的其余部分?

我拥有的最好的解决方法是以下方法,它可以工作,但需要您在 之前运行 doctests make html,并在尚未生成图像时在 doctest 运行中产生烦人的警告:

>>> import time
>>> def make_result():
...     time.sleep(100) 
...     return [3, 4]
>>> result = make_result()
>>> print(result)
[3, 4]
>>> import matplotlib.pyplot as plt
>>> plt.plot(result)
>>> plt.savefig('result.png')

.. image:: result.png
Run Code Online (Sandbox Code Playgroud)