#python #matplotlib #python-sphinx #doctest
Вопрос:
Расширение Sphinx sphinx.ext.doctest
упрощает проверку актуальности вашей документации. В то же время matplotlib.sphinxext.plot_directive
расширение упрощает автоматическое создание рисунков как части вашей документации.
В моей ситуации я хотел бы объединить лучшее из обоих расширений и
- выполните некоторые медленные вычисления,
- проверьте результаты с помощью doctest,
- постройте график результата.
То есть что-то похожее на приведенное ниже:
>>> 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