Python——工作中的代码调试经验
【说在前面】
作为一名算法工程师,结合个人的理解,需掌握四种语言:文字语言 + 符号语言 + 图形语言 + 编程语言。
- 文字语言 —— 能向不同的人清楚地表达自己的想法、观点与问题,编写技术文档、PPT汇报,以及总结能力等;
- 符号语言 —— 要知道如何用专业的符号来描述问题(需要具备相应的数学功底,但不是纯秀数学功底,而不落地),并进行逻辑推理,证明等,不人云亦云,要有自己独到的见解;
- 图形语言 —— 与别人讨论或交流时,用图形去解释问题,往往起到事半功倍的效果,高效率汇报工作的能力体现;
- 编程语言 —— 自己写出来的算法,自己要会实现,也要看得懂、跑得通别人的代码,如Github、码云或Gitlab等
【Python编程语言中bug本质】
无论是科研还是工作,这四种语言中,编程语言都很重要(如果科研或工作中不需要用到代码,那么请忽略),也可能是它需要投入的时间和精力更多,尤其是代码调试能力,大部分决定能否复现别人的论文或源码?决定是否能够快速定位线上问题,并解决。接下来,结合笔者科研与工作中的经验,记录一些python编程语言中bug本质。
- 数据类型错误,如数据结构、tensor数据类型、数值类型、越界、空指针等等;
- 包版本不兼容导致的错误,如机器学习或深度学习,经常会调用各种包,配置各种环境,这时很容易出现包与包版本不兼容的问题【本质:此包中的代码调用彼包中的代码,报错。原因:要么不支持该功能、要么数据类型问题、要么高版本不兼容低版本(Python常有的事)等等】;
- 缺少某个包【本质:缺少对应的功能函数】,上篇文章已举例说明:Python——annoy的安装&如何安装包
- 路径问题【因为路径不对导致无法进行文件操作,需注意不同操作系统中下的相对路径、绝对路径...,以及 "/ " "\\ " r"\"三者之间的区别】
- ……
【如何调试】
分两步走:定位问题 + 解决问题
- 定位:首先根据认(jian)真(chi)分析报错的问题,其次通过在对应报错代码行数中不断添加“打印”、“数据类型”、“对象具体值”等功能,便可快速定位问题。如:
-
print("-------------------, 调试点1", type(对象A), 对象A)
- 解决:一般地,大家都会先去Google、百度、知乎、Github、简书、CSDN、StackOverflow等网上,看看是否有现成的解决方案,如果有,那就没啥说的。如果没有,这时候只能靠自己了,就得结合所报bug去思考出错的具体原因了,比如分析是不是因为上面总结到的一些bug本质导致的。通常情况,只要定位到问题,基本都可以解决或找到解决方案。
特别说明:从码云和GitHub中下载别人的源码,自己又跑不通的时候,建议多去关注下issues(养成习惯)。比如BERT-Flow:https://github.com/bohanli/BERT-flow,源码跑不通,刚出来的源码肯定没啥相关资源或解读,这时候就多留意issues部分,可以自己提问,或者私信请教……
【写在最后】
整理些工作中常见bug的解决方案,持续中......
(1)TypeError: 'module' object is not callable(“模块”对象不可调用):https://zhuanlan.zhihu.com/p/56815118
根本原因:自己忘了python中模块和函数的区别,即用的是模块而不是函数!!!