首页 > 解决方案 > 结合 doctest 和 Matplotlib 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()

就目前而言,这不会很有效,因为 plot 指令没有可用的前一个 doctest 块的上下文。此外,使用 plot 指令的“context”选项似乎还不够,因为它摆脱了 doctest,这意味着我将没有上下文可用于未来的非 plot 指令块。

所以我的问题是:

结合这两个操作(断言和绘图)的最佳方式是什么,同时仍然让断言作为 doctest 运行,并且不运行两次慢速操作,并确保代码的 doctest 部分中设置的变量仍然可用文件的其余部分?

我拥有的最佳解决方法是以下方法,但需要您在之前运行make htmldoctest,并在尚未生成图像时在 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

标签: pythonmatplotlibpython-sphinxdoctest

解决方案


推荐阅读