新闻中心
在Sphinx doctest中处理Matplotlib图形示例的策略

本文探讨了在Sphinx doctest中使用包含Matplotlib图形示例的文档字符串时,如何避免因`plt.show()`导致的测试阻塞问题。核心策略是优化Matplotlib绘图函数,使其接受可选的`ax`参数,并将图形显示逻辑(`plt.show()`)从函数内部移除,从而允许doctest在非交互模式下顺利运行,并提升函数的可重用性与灵活性。
解决Sphinx doctest中Matplotlib图形阻塞问题
在Python项目中使用Sphinx生成文档并利用其doctest功能进行代码示例验证是一种高效实践。然而,当函数的文档字符串中包含Matplotlib绘图示例,并且函数内部调用了plt.show()时,doctest在执行这些示例时会因图形窗口的弹出而暂停,需要手动关闭窗口才能继续,这极大地影响了自动化测试流程。本教程将详细介绍如何通过优化Matplotlib绘图函数来解决这一问题。
1. 问题根源分析
原始的绘图函数通常会直接在函数内部创建图形并调用plt.show()来显示它。例如,考虑以下函数:
import matplotlib.pyplot as plt
def plot_numbers_original(x):
"""
显示一组数字的折线图。
Parameters
----------
x : list
要绘制的数字列表。
Example
-------
>>> import your_module_name # 假设函数位于 your_module_name 模块中
>>> x = [1, 2, 5, 6, 8.1, 7, 10.5, 12]
>>> your_module_name.plot_numbers_original(x)
"""
_, ax = plt.subplots()
ax.plot(x, marker="o", mfc="red", mec="red")
ax.set_xlabel("Label for x-axis")
ax.set_ylabel("Label for y-axis")
ax.set_title("Title of the plot")
plt.show() # 这一行是导致doctest阻塞的根源当Sphinx make doctest命令执行到your_module_name.plot_numbers_original(x)时,plt.show()会被调用,弹出一个Matplotlib图形窗口。在非交互式或自动化测试环境中,这个窗口不会自动关闭,导致测试进程挂起,需要用户手动干预才能继续。这与自动化测试的初衷相悖。
2. 优化Matplotlib绘图函数
解决此问题的核心策略是将绘图逻辑与图形显示逻辑解耦。具体做法是让绘图函数接受一个可选的Matplotlib Axes 对象作为参数。如果用户提供了Axes对象,函数就在该对象上绘图;如果未提供,函数则自行创建一个新的Figure和Axes。最重要的是,从函数内部移除plt.show()的调用。
TTSMaker
TTSMaker是一个免费的文本转语音工具,提供语音生成服务,支持多种语言。
2275
查看详情
以下是优化后的函数示例:
import matplotlib.pyplot as plt
def plot_numbers(x, *, ax=None):
"""
显示一组数字的折线图。
Parameters
----------
x : list
要绘制的数字列表。
ax : matplotlib.axes.Axes, optional
可选的Matplotlib Axes对象,用于在该坐标轴上绘图。
如果未提供,函数将创建一个新的Figure和Axes。
Example
-------
>>> import your_module_name # 假设函数位于 your_module_name 模块中
>>> x = [1, 2, 5, 6, 8.1, 7, 10.5, 12]
>>> result_ax = your_module_name.plot_numbers(x)
>>> # 在doctest中,我们通常不显示图形。我们可以验证函数是否正确地设置了坐标轴属性。
>>> len(result_ax.lines) # 验证图中绘制的线条数量
1
>>> result_ax.get_xlabel() # 验证x轴标签
'Label for x-axis'
>>> result_ax.get_title() # 验证图表标题
'Title of the plot'
>>> # 如果需要在交互式环境或特定测试中显示图形,可以这样做:
>>> # fig, my_ax = plt.subplots()
>>> # your_module_name.plot_numbers(x, ax=my_ax)
>>> # plt.show() # 在需要显示时由外部调用
"""
if ax is None:
_, ax = plt.subplots() # 如果没有提供ax,则创建一个新的Figure和Axes
ax.plot(x, marker="o", mfc="red", mec="red")
ax.set_xlabel("Label for x-axis")
ax.set_ylabel("Label for y-axis")
ax.set_title("Title of the plot")
return ax # 返回Axes对象,以便外部进行进一步操作或显示关键改动点:
- ax=None 参数引入: 函数现在接受一个可选的ax参数,其类型应为matplotlib.axes.Axes。
- 条件性plt.subplots(): 只有当ax未提供时,函数才会在内部调用plt.subplots()来创建一个新的图形和坐标轴。这确保了函数既可以独立使用,也可以作为更大绘图流程的一部分。
- 移除plt.show(): 最重要的一点是,plt.show()被完全从函数内部移除。这意味着函数本身不再负责显示图形,而是将显示控制权交由调用者。
- 返回ax对象: 函数现在返回它所操作的Axes对象。这允许调用者在函数执行后,对该Axes对象进行进一步的自定义或决定何时显示、保存图形。
3. 优化后的优势
这种重构带来了多方面的好处,显著提升了代码质量和开发效率:
- Sphinx Doctest兼容性: 由于plt.show()不再在函数内部被调用,doctest在执行示例时不会弹出图形窗口,从而避免了阻塞,实现了自动化测试流程。
-
更高的灵活性和可重用性:
- 组合绘图: 用户可以将多个绘图函数的输出绘制到同一个Axes对象上,轻松实现复杂的组合图或子图布局。
- 外部控制: 调用者可以完全控制图形的生命周期和显示方式(例如,保存到文件、嵌入到GUI应用中,或在交互式会话中显示)。
- 符合设计模式: 这符合Matplotlib推荐的“辅助函数”(helper functions)设计模式,即函数应该只负责绘图,而不负责图形的创建和显示。
- 非交互式测试友好: 无论是doctest还是其他单元测试框架,都可以在不产生任何图形界面的情况下测试绘图逻辑,从而提高测试效率和稳定性。
4. 注意事项与最佳实践
- 何时调用 plt.show(): plt.show()通常应该在脚本的顶层,或者在交互式会话的末尾调用,当你准备好显示所有图形时。在库函数或模块内部调用它会限制其灵活性,并可能导致上述测试问题。
- 图形关闭: 在自动化测试环境中,即使没有plt.show(),如果测试过程中创建了
以上就是在Sphinx doctest中处理Matplotlib图形示例的策略的详细内容,更多请关注其它相关文章!
# 如何处理
# 营销推广显示赞助吗
# 仪陇县推广营销
# 番禺区seo优化
# 泰安网站建设哪家更好
# 江西正规专业seo优化
# 茅台的网站推广方式是
# 宿迁寺庙网站建设
# 推广新品牌营销公司
# 丹灶seo优化排名
# 查看谷歌关键词排名
# python
# 如何使用
# 调用者
# 文档
# 数据处理
# 重构
# 弹出
# 移除
# 创建一个
# 可选
# red
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
C++如何实现异步操作_C++11使用std::future和std::async进行异步编程
C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程
Win10桌面图标出现小盾牌怎么办 Win10去除UAC图标教程【解决】
夸克浏览器图书入口 夸克手机浏览器阅读入口
Yandex免登录官网入口_俄罗斯Yandex搜索引擎直达链接
顺丰国际快递查询 国际件官方查询入口
谷歌google账号怎么注册账号 谷歌账号注册官方流程
PPT平滑切换怎么做 PPT炫酷“平滑”切换动画制作教程【必学】
千牛数据看板网页版_千牛数据看板网页版访问方法
win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】
c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析
怎么在浏览器上运行HTML文件_浏览器运行HTML文件技巧【技巧】
HTML空白字符处理机制:渲染、DOM与编码实践
小红书商家版怎样在笔记嵌入商品卡路径_小红书商家版在笔记嵌入商品卡路径【挂载教程】
QQ邮箱登录平台入口 QQ邮箱网页版邮箱官方入口
如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构
谷歌推RCS信息存档功能:公司可监控员工私密信息!
Win10如何清理注册表垃圾 Win10注册表维护与优化指南【慎用】
地铁跑酷免费秒玩入口链接 地铁跑酷小游戏免费秒玩网站
Angular中单选按钮的正确使用与常见陷阱解析
火锅吃太多会怎样 火锅吃太多会上火吗
QQ邮箱电脑版登录入口_QQ邮箱官方网站登录平台
凉拌黄瓜怎么拌更入味 凉拌黄瓜简单家常做法
126邮箱手机版登录官网2026_126手机邮箱免费入口最新
J*aScript中高效管理与清空动态列表:避免循环陷阱
必由学在线入口 必由学网页版快速登录入口
必由学官方登录入口 必由学教师学生账号快速访问
使用 Pandas 高效处理 .dat 文件:数据清洗与数值计算实战
整合Supabase认证与Django模型:跨模式迁移的解决方案
QQ邮箱登录首页官网地址2026 QQ邮箱官方网页入口
高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法
12306选座怎么选到特殊座位_12306特殊座位选择注意事项
一加手机电池耗电快怎么办_一加手机电池耗电快的解决方法
MongoDB Aggregation:在嵌套对象数组中精确匹配ObjectId
QQ邮箱在线登录平台 QQ邮箱个人邮箱网页版入口
在Typer应用中优雅地处理和重组任意命令行参数
在J*a项目里如何构建对象之间的契约_接口约束的实际落地
C++ explicit关键字防止隐式转换_C++构造函数安全规范
win11 arm版怎么安装 M1/M2 Mac虚拟机安装ARM win11的方法
初次安装JDK时环境变量如何正确配置_J*A_HOME与PATH设置规则讲解
《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!
J*aScript DOM操作:高效清空列表元素的策略与实践
Yandex搜索引擎一键访问入口_俄罗斯Yandex官网免登录
痛风发作了怎么办? 快速止痛和后期饮食调理
Excel组合图表怎么做 Excel创建柱状图与折线组合图教程【图表】
Golang如何优化内存分配与垃圾回收_Golang内存管理与GC优化实践
UC浏览器网页版登录入口官网 电脑版网址入口
Python异步编程实践:使用Binance API构建实时交易数据流
word邮件合并后日期格式不对怎么改_Word邮件合并日期格式修改方法
Composer的 "conflict" 字段有什么用_如何声明不兼容的包以避免依赖冲突


2025-12-02
浏览次数:次
返回列表