如何高效地调试 py 程序?

2022-10-08 10:03:08 +08:00
 JYLu
实现一些数值计算的算法,主要的精力都集中在把算法中的数学语言转化成编程代码了。代码质量就不高。常会出现很多小错误。py 没有编译,找错只能靠不断运行发现,但是这样一次只能改一个 bug 。每次调试都要比写下程序本身花数倍的时间,对精力是极大的损耗。
还有除了使用 print()语句,有没有什么好的调试技巧,可以使得调试更高效?
3214 次点击
所在节点    程序员
31 条回复
flyaway
2022-10-08 10:07:28 +08:00
Yourshell
2022-10-08 10:10:04 +08:00
除了 print 还可以使用 logging
MaxLv
2022-10-08 10:12:48 +08:00
pycharm debug 好使
vone
2022-10-08 10:16:38 +08:00
siluni
2022-10-08 10:17:21 +08:00
用 pytest 写单元测试吧
kmyq
2022-10-08 10:18:57 +08:00
pycharm 直接调试就挺好使的啊
0x0208v0
2022-10-08 10:24:05 +08:00
没用 Py 搞过复杂的数值计算并且调试,计算应该会有输入和中间结果吧?多在关键点打点 log🉑️吗,有的时候服务很难调试,只能通过看 log 判断哪儿有问题
arischow
2022-10-08 10:26:50 +08:00
这跟有没有编译没有直接关系吧
dantangfan
2022-10-08 10:30:21 +08:00
yuelang85
2022-10-08 10:45:26 +08:00
@dantangfan 这个 pylane 相当不错,目测可以在线 debug 生产环境进程
CamD
2022-10-08 10:48:05 +08:00
spyder 听说不错
qq976739120
2022-10-08 10:57:52 +08:00
之前也做过一些把论文翻译成代码的工作, 尽量一段段写或者抽离成一个个小函数,确认没问题了再写下去. 全部写完整体测然后找中间的 bug,真的很头疼很头疼. 后来就是重写的.
JYLu
2022-10-08 11:09:31 +08:00
@arischow 主要是编译的过程可以一次性发现许多结构性的问题,比如类型错误,什么的。现在就是每次测试都要跑一遍,每跑一遍只能发现一个错误,就很折磨。
Anarchy
2022-10-08 11:12:28 +08:00
看楼主需求指编译对等工作,那就对应 lint 工具这块做的好不好了,pycharm 应该能满足吧。
pepesii
2022-10-08 11:16:01 +08:00
可以尝试下接入一些监控相关的东西, 例如 sentry
可以加入一些 dataclass 或者 pydantic 的验证
尽可能的把函数或者模块抽离的更细粒度一些,确保每个模块级别的东西没有问题,input 和 output 能得到保证
JYLu
2022-10-08 11:17:21 +08:00
@siluni 谢谢,我试一试。
TimePPT
2022-10-08 11:20:35 +08:00
利用 lint 工具做代码规范检查
利用 mypy 做静态类型检查
利用 radon 做圈复杂度等检查
学会捕获和处理异常
关键步骤打 log
lookStupiToForce
2022-10-08 11:20:43 +08:00
pycharm debug mode
打断点或者勾选运行时报错自动中断进入调试都可以,保留你报错时的原发多层环境,方便调试和溯源
stein42
2022-10-08 11:24:11 +08:00
用 pycharm 可以实时提示语法错误,再加上类型标注可以避免类型错误。
单元测试可以确保一个函数得到期望的结果。
logging 可以在运行时输出一些信息,比 print 更好用。
JYLu
2022-10-08 11:25:37 +08:00
@TimePPT 专业!谢谢。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/885154

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX