
我教了十一年Python,踩过的坑比学生写的bug还多。每次改作业都像在破案,有些错误简直让人哭笑不得。今天说几个真正管用的调试技巧,特别是第七个,我教了十年才弄明白。
1. 用print别打脸充胖子
很多人觉得print太低端,非要用logging。我教过的学生里,十个有九个在logging配置上花的时间比解决问题还多。print加个前缀就行,比如print('【debug】变量a的值是:', a)。完事了再批量删,比折腾日志级别省心多了。我见过最离谱的是学生为了调试,写了个完整的日志系统,结果日志文件太大把磁盘撑爆了。
2. 异常信息要看全
很多学生看到报错只读最后一行。我说你看过大熊猫吃竹子的视频吗?它从头啃到尾。Python的报错也是,从Traceback开头一行行看,哪个文件哪一行调了哪个函数全写清楚了。有次一个学生说代码跑不动,我让他把完整报错发来,一看是从第三方的包开始崩的,根本不是他自己的问题。
3. 用if __name__ == '__main__'隔离测试代码
有人喜欢在脚本末尾直接加测试代码,等导入其他文件时就爆炸了。加个保护条件,测试代码只在直接运行时生效。这个技巧简单但真管用。我班上有个学生,每次调试都要注释掉整个主函数,就因为这个没学明白。
4. 处理文件别忘了用with
手写f.open()然后忘了f.close(),文件句柄泄漏了。程序跑久了突然崩了,你还以为是内存问题。用with open() as f:,自动关闭。这个我念叨了十年,但每次批改作业还是能看到有人不关文件。有次一个学生写的数据处理脚本,跑完一百个文件就卡死了,就是因为句柄泄漏。
5. 检查变量类型用type()不是猜
“我觉得它是字符串”——这句话我听过一千次了。跑一下type(variable)看一眼,2秒钟的事。学生总爱猜变量类型,一猜就错。特别是从文件读数据的时候,数字可能是个字符串,布尔值可能是个'True'文本。有个作业是写计算器,有个学生输入的'1'和'2'怎么也加不对,就是一查类型发现是字符串。
6. 字典访问用get别用中括号
dict['key']键不存在就直接崩溃。dict.get('key', 默认值)至少不会死。学生写爬虫的时候,这个问题犯得最多。网页结构稍微变一下,某个字段没了,整个程序就崩溃了。用get方法加个默认值,程序健壮多了。
7. 局部变量在闭包里怎么抓?用nonlocal!
这个技巧我真是用了十年才彻底搞明白。很多人写过这样的代码:在函数里面再定义一个函数,想改外层函数的变量,结果改了跟没改一样。因为内层函数默认只能读外层变量,不能写。加上nonlocal 变量名就告诉Python:“这个变量不是我的,是我外面那个函数的”。之前我跟一个做机器学习的同事调试了三天,就是没加nonlocal,计数变量死活不涨。后来他在代码里加了nonlocal,问题一秒就解决了。他当时那个表情我现在都记得,又惊讶又想骂人。
8. 调试循环用范围值
循环里出错了,别跑完一万次。用for i in range(3):先试三次。确定逻辑对,再把范围改回去。有个学生写了个死循环,电脑风扇呼呼转了一个小时,就为了调试一个简单的列表去重。我说你先跑三次看看结果对不对,他试了之后发现是自己的缩进写错了。
9. 小改动后立刻跑一下
攒了一堆改动再跑,出错了都不知道是谁惹的祸。改一行跑一下,改两行跑两下。加个print就运行一次,确认输出对再加下一个。这个习惯养成了,调试时间能少一半。我见过最夸张的是有个学生改了八十行代码,然后才跑,报错了也不知道从哪开始查,最后全删了重写。
10. 用pdb断点调试
实在看不懂,就用import pdb; pdb.set_trace()。程序停在那里,你能一步步看变量值。这个比print精确多了,就是学起来有点门槛。但我发现教了学生之后,他们的效率提升特别明显。有个学生之前调试一个字符串解析问题花了三个小时,学会pdb之后,十分钟就搞定了。
写代码出错不可怕,可怕的是不知道怎么找问题。这些技巧我用了十年才攒下来,你花十分钟看完,能少走不少弯路。
以上就是“Python调试技巧大全,第7个我用了十年才知道!”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。
扫码二维码 获取免费视频学习资料

- 本文固定链接: http://www.phpxs.com/post/14465/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料