
本教程探讨了在sphinx文档中,当使用`doctest`测试包含matplotlib绘图示例的文档字符串时,如何避免交互式图形窗口中断测试流程的问题。核心解决方案是重构matplotlib绘图函数,使其接受可选的`ax`参数,并将图形的显示控制权(即`plt.show()`的调用)交由调用者处理,从而实现无缝的自动化测试。
在使用Sphinx生成项目文档并结合doctest模块进行代码示例测试时,开发者可能会遇到一个常见问题:当函数的文档字符串中包含Matplotlib绘图示例,并且这些示例调用了plt.show()方法时,doctest的执行会被中断。plt.show()会打开一个交互式的图形窗口,这要求用户手动关闭窗口才能让doctest继续执行,这显然不符合自动化测试的需求。
问题的根源在于plt.show()的设计。它旨在显示当前活动的Matplotlib图形,并进入一个事件循环,直到图形窗口被关闭。在自动化测试环境中,这种行为会导致测试进程挂起,因为它期待用户交互。为了实现自动化测试,我们需要一种机制,既能让doctest验证绘图逻辑,又不会触发交互式窗口。
解决此问题的关键在于改变Matplotlib绘图函数的结构,使其不负责图形的最终显示,而是将这一控制权交给调用者。具体而言,就是让绘图函数接受一个可选的matplotlib.axes.Axes对象作为参数,并在函数内部移除plt.show()的调用。
PHP经典实例(第2版)能够为您节省宝贵的Web开发时间。有了这些针对真实问题的解决方案放在手边,大多数编程难题都会迎刃而解。《PHP经典实例(第2版)》将PHP的特性与经典实例丛书的独特形式组合到一起,足以帮您成功地构建跨浏览器的Web应用程序。在这个修订版中,您可以更加方便地找到各种编程问题的解决方案,《PHP经典实例(第2版)》中内容涵盖了:表单处理;Session管理;数据库交互;使用We
453
以下是根据上述理念重构后的plot_numbers函数:
import matplotlib.pyplot as plt
def plot_numbers(x, *, ax=None):
"""
显示一组数字的折线图。
Parameters
----------
x : list
要绘制的数字列表。
ax : Axes, optional
可选的Matplotlib Axes对象,用于在其上绘制数字。
如果未提供,将自动创建一个新的Axes。
Example
-------
>>> import calc # 假设此函数在 calc 模块中
>>> x = [1, 2, 5, 6, 8.1, 7, 10.5, 12]
>>> ax = calc.plot_numbers(x)
>>> # 在实际应用中,如果需要显示,可以在此处调用 plt.show()
>>> # 例如:plt.show()
>>> # 为了doctest的自动化,我们不在这里调用 plt.show()
>>> # 而是检查返回的ax对象是否有效
>>> import matplotlib.pyplot as plt
>>> assert isinstance(ax, plt.Axes)
>>> # 可以进一步检查ax中的内容,例如线条数量等
>>> assert len(ax.lines) == 1
"""
if ax is None:
_, ax = plt.subplots() # 如果没有提供Axes,则创建一个新的
ax.plot(x, marker="o", mfc="red", mec="red")
ax.set_xlabel("X轴标签")
ax.set_ylabel("Y轴标签")
ax.set_title("图表标题")
return ax通过将Matplotlib绘图函数重构为接受可选的ax参数并移除内部的plt.show()调用,我们不仅解决了Sphinx doctest在处理绘图示例时遇到的交互式图形窗口中断问题,还提升了函数的通用性和可测试性。这种设计模式使得绘图函数更加模块化,更易于集成到不同的应用场景和自动化测试流程中,是编写高质量Python绘图库的推荐实践。
以上就是解决Sphinx doctest中Matplotlib示例的交互式图形问题的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号