引言
出现问题了怎么办?
找问题?
怎么找?
如果是java 或者android的话,我们其实有两种思路:
一种是打log
一种是调试
其实大多数的编程都很类似,python的这两种方法也都可以
python可以使用 print() 打印出需要筛查的变量,或者类,但是缺点是测试完后需要记得删除,略显复杂
当然也可以调试
下面着重讲解下「调试」
调试
说是调试,其实python并不能真正的添加断点进行 断点调试 ,但是python提供的别的好用的方式来实现调试功能:
一、断言-assert
断言的意思是,假定某个条件成立的话,程序怎么运行
断言其实可以应用到任何我们想检测出现问题的地方,我们举个例子
def foo(s):
n=int(s)
#假定n不等于0
assert n!=0,'n is zero'
return 10/n
foo(0)
我们来看一下程序运行结果
assert 的意思是,表达式n!=0 应该是True,否则,根据程序运行的逻辑,后边的代码肯定会出错。
如果断言失败的话,就会报出 AssertionError , 并且提示断言中的第二个参数
本例中的第二个参数是“n is zero”
但是,如果程序中到处都是 assert ,那么其实也是很乱的,幸运的是 python 为我们提供了方法
我们可以在运行 python 文件的时候使用 -O 参数来关闭 assert
我们来通过 -O 去执行上方我们运行的文件
我们可以看到,assert 已经被禁掉了
关闭后,你可以把所有的assert语句当成pass来看。
二、logging
把 print() 改成 logging 也是调试 bug 的一种方式,和assert相比,logging不会抛出错误,而且还可以输出到文件:
但是发现除了只输出了错误类型,也对程序也没什么影响啊
没关系,只需配置一个logging的配置就可以了
如下
我们只是在导入logging之后添加了
logging.basicConfig(level=logging.INFO)
这样的话,就能看到效果了
#执行完后,显示输出了
INFO:root:n=0
logging的等级
其实
logging.basicConfig(level=logging.INFO)是设置了logging的等级
等级有
- DEBUG
- INFO
- WARNING
- ERROR
他们之间有优先级
————————————————
当我们设置了
level=logging.INFO
的时候
logging.debug就看不到输出效果了
————————————————
当我们设置了
level=logging.ERROR
的时候
logging.debug
logging.info
logging.warning
输出的信息也就都看不到了
这样一来,就可以放心的输出不同级别的logging,最后只需要修改一下logging的level就能看到
想要看的logging了
除此之外,logging的另外一个好处是通过简单的配置,一条语句可以同时输出到不同的地方,比如console和文件
三、pdb
pdb则是python的调试器,让程序以单步方式运行,可以随时查看运行状态
下面来看示例
我们准备好一个有错误的程序
#err.py
s='0'
n=int(s)
print(10/n)
然后我们启动pdb 去单步调试我们的err.py文件
启动方法
python -m pdb err.py
然后进入pdb模式之后,输入命令l(注意,这个不是1 而是英文字母l),可以查看代码
输入命令n,可以向下执行代码
任何情况下输入p 变量名 去查看变量的值
输入q 结束pdb,退出程序
我们来看一下实际案例
——————————————————————
这种通过p 去逐行调试是万能的,但是如果我们要调试的代码很长的时候呢?那么这个逐行调试就不适用了,幸运的是python为我们提供了方便的方法
pdb.set_trace()
这种方法其实也是用的pdb调试器,但是我们这个时候需要导入pdb类
import pdb
然后,在可能出错的地方放上这句指定
#trace有痕迹的意思,这就是设置标记的意思哦
pdb.set_trace()
这句命令其实就是相当于加了一个端点
我们来看详细代码
import pdb
s='0'
n=int(s)
pdb.set_trace()#运行到这里程序会暂停,这是可以通过p 变量名查看变量,通过c进行运行
print(10/n)
好,我们来看一下具体代码和具体操作
这种方法比直接启动pdb 单行调试效率高很多,但是也不是很高
四、IDE
如果要比较爽的设置断点、单步执行就需要一个支持调试的 IDE 。
目前比较好用的IDE有
Visual Studio Code : https://code.visualstudio.com/,需要安装Python插件。
PyCharm : http://www.jetbrains.com/pycharm/
另外,Eclipse加上pydev插件也可以调试Python程序。
小结
写程序最痛苦的事情莫过于调试,程序往往会以你意想不到的流程来运行,你期待执行的语句其实根本没有执行,这时候,就需要调试了。
虽然用IDE调试起来比较方便,但是最后你会发现,logging才是终极武器