Объединение расширений doctest и Matplotlib Sphinx

#python #matplotlib #python-sphinx #doctest

Вопрос:

Расширение 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 кажется недостаточным, поскольку она избавляет от doctest и означает, что у меня не будет контекста, доступного для будущих блоков, не связанных с директивой plot.

Поэтому мой вопрос таков:

Каков наилучший способ объединить эти две операции, утверждение и график, при этом все еще выполняя утверждение как doctest, и не выполняя медленную операцию дважды, и гарантируя, что переменные, заданные в части doctest кода, остаются доступными для остальной части документа?

Лучшее решение, которое у меня есть, — это следующее, которое работает, но требует, чтобы вы запускали тесты до make html этого, и выдает раздражающие предупреждения при запуске теста, когда изображение еще не было сгенерировано:

 >>> 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