运行后,如果出现报错提示,我们可以通过报错提示和问题文件路径定位bug,我们可以通过点击文件路径到达出问题的代码行,但有时报错会提示很多文件路径,我们可以通过查看路径,是否为自己运行的代码路径来缩小范围。
点击后:
可以确定是红框部分的键名有误。
方法小结:
短板:该方法只能定位导致python无法运行的bug,无法定位业务和数据方面的bug
下图是一个简单的运算函数
运行结果为:
很明显这个函数有bug,需求的运行结果因该是3,可实际运行结果明显不符,我们可以使用print语句打印比较可能出问题运算部分
运行结果为:
通过运行结果我们可以确定,是浮点数相加引起的bug(课外补充: 该bug是python进行浮点数计算精度丢失引起的,具体涉及到底层逻辑不多赘述,可以使用第三方模块decimal解决精度丢失问题)。
方法小结:
短板:该方法涉及到的变量和模块较多且无法确定范围时不适宜使用
1、首先我们要了解__name__和“__main__”分别表示什么
python中模块(也就是一个py文件)运行除了做为主线程执行(也就是执行的第一个py文件)以外,还可以通过import被引用执行。
__name__是创建py文件会自动导入的一个内置类属性 ,为了更好的理解这个变量的作用我举了个例子,下图为aa.py文件一段代码:
如果aa.py做为主线程执行,__name__值则为__main__,执行结果如下:
我是__main__
如果aa.py被bb.py引用执行
__name__值则为aa,也就是aa.py的模块名,执行结果如下:
哪怕是通过cc.py调用bb.py来执行aa.py
__name__值依然为aa.py的模块名
2、“if __name__ == '__main__':”的作用
通过上文我们已经了解到__name__变量在不同情况执行值的变化,细心的朋友会发现上面的执行结果是重复的,被调用的层次越多重复的结果也越多,那是因为python中引用执行第三模块,不只会执行引用的方法或属性,还会执行第三方模块的全局代码,因此造成了重复执行的情况,为了更好的理解被重复执行的过程,可查看下方流程图 :
那在一个项目中是由多个模块组成,我想验证单个模块是否可以正确执行,在模块中对本模块的类或方法进行调用验证后,不想本模块被调用后被重复执行,可以选择调试完后删除调试代码,但这样做容易忘记,并且下次再想调试这个模块又得重新写调试代码,十分麻烦。
而“if __name__ == '__main__':”则可以解决这个问题,将调试代码放入这个判断语句中,调试代码只有模块做为主线程执行时才会被执行,完美的规避了模块被调用执行后,调试代码也被执行的问题。
方法小结:
__name__是一个模块的内置类属性,模块被调用执行时,属性值为模块名,模块做为主线程执行时,属性值为__main__ ,可将调试代码放进入“if __name__ == '__main__':”语句中,运行时判断本模块是否做为主线程执行,只有本模块做为主线程执行时才会执行调试代码。
注:小编的pycharm版本是PyCharm 2020.2.2 (Community Edition) 不同版本界面可能存在些许差异
(1)、操作:
开启断点:点击代码左侧或点击 [ Ctrl + F8 ]设置断点
关闭断点:点击已设置断点代码的左侧或点击 [ Ctrl + F8 ]关闭断点
(2)、作用:
在以调试模式运行时,断点前代码会正常执行,运行到断点中的代码,程序会暂时挂起,通过该功能可以跳过不需要调试的代码部分,从而节省时间。
执行结果:
注意:将断点打在定义函数的代码行(也就是“def 函数名()”那一行)断点不会生效;如果要在函数引用前暂停执行代码,需要将断点打在函数引用语句;如果要在函数被引用后暂停执行代码,需要将断点打在函数里的第一行代码。
2、以调试模式执行代码
可通过点击页面右上角的 和鼠标右击后点击[debug],以调试模式执行代码
当代码以调试模式执行后,会有如下情况:
(1)代码执行完断点前的代码会进行暂停
(2)断点的代码行被蓝色标记,表示代码已运行到该处,但还未执行
(3)Debug tool window窗口的出现,显示当前的调试信息,可通过界面的功能对代码进行调试
3、调试器界面功能介绍
(1)界面切换
可通过点击下图的debugger和Console按钮,进行Debugger(调试器)界面和Console(控制台)界面的切换
(2)Show Execution point (显示执行点)
如果你的光标在其他行或其他页面,可通过点击或 [ Alt + F10 ], 回到当前代码执行的行
(3) Step Over (步过)
可通过点击 或[ F8 ],执行蓝色标记代码,若蓝色代码为函数的调用,则不会进入函数的代码块里,而是做为一步把函数的代码块全部执行
(4)Step Into (步入)
可通过点击或[ F7 ]执行蓝色标记代码,若蓝色代码为函数的调用,则进入函数代码块里
(5)Step Into My code(步入自己的代码)
可通过点击或[ Alt + Shift+ F7 ]执行蓝色标记代码,
若蓝色代码为libraries里模块(第三方模块)函数的调用,则不会进入函数的代码块里,而是做为一步把函数的代码块全部执行;
若蓝色代码为自己代码函数的调用,则进入函数代码块里;
若通过已运行到libraries模块代码块里,可通过点击一步执行完libraries模块的剩余代码,回到自己的代码
(6)Force Step Into(强制步入)
点击下图红框处按钮,可进入任何方法,查看底层源码的时候可以用这个进入官方类库的方法。(小编的pycharm不知道为何不能无法使用该功能,不知道是不是因为版本问题,知道的大佬可帮忙在下方留言)
(7)Step Out (步出)
若在函数里点击或[ Shift+ F8 ],可一步执行剩余代码块,返回上一层代码块
若在主代码中里点击或[ Shift+ F8 ],则一步执行剩余所有代码
(8)Run to Cursor (运行至下一个断点)
点击或[Alt + F9]可以一步运行至下一个断点,若无下一个断点则一步执行剩余所有代码
(9)Variables(变量区)
在变量区可以查看当前断点之前的当前程序内的变量。
(10)Watches(查看变量)
一开始不会显示Watches窗口需点击后才会显示。
Watches的作用是可以将Variables区中的变量拖到Watches中查看,主要使用场景是变量较多,不好查看指定变量时使用
方法小结:
该方法是本篇介绍的调试方法中功能最为强大应用最广泛的一个方法,硬要说缺点的话,就是相较上几个方法操作稍显繁琐了一点,调试模式的功能还有很多,因篇幅原因,只介绍了它基本功能的使用,感兴趣的朋友可上网查找详细功能介绍。
总结:
在开发过程中,调试代码会占据很大一部分时间,希望本篇介绍的方法有帮助到你,让你更好更快的定位到程序当中的bug。
ps:新手小编,如有错误虚心改正