Python day 9(陆) 调节和测试

次第能叁遍写完并平常运行的票房价值相当的小,基本不超过壹%。总会有精彩纷呈的bug要求校正。有的bug很轻松,看看错误新闻就明白,有的bug很复杂,大家须求明白出错开上下班时间,哪些变量的值是科学的,哪些变量的值是大错特错的,因而,必要一整套调节和测试程序的手腕来修复bug。

Python day 9(6) 调试,pythonday

程序能一遍写完并正常运作的票房价值比异常的小,基本不超越①%。总会有两种八种的bug要求勘误。有的bug很简短,看看错误消息就通晓,有的bug很复杂,我们须求精晓出错开上下班时间,哪些变量的值是毋庸置疑的,哪些变量的值是破绽百出的,由此,需求壹整套调节和测试程序的手法来修复bug。

法1:用print() 函数,把也许非常的变量打字与印刷出来看

1 def foo(s):
2     n = int(s)
3     print('>>> n = %d' % n)
4     return 10 / n
5 
6 def main():
7     foo('0')
8 
9 main()

 试行后在输出中找找打字与印刷的变量值

1 $ python err.py
2 >>> n = 0
3 Traceback (most recent call last):
4   ...
5 ZeroDivisionError: integer division or modulo by zero

print()最大的害处是他日还得删掉它,想想程序里随地都是print(),运营结果也会含有众多破烂音讯。

法二:断言(凡是用print()来协理查看的地点,都得以用断言(assert)来顶替)

1 def foo(s):
2     n = int(s)
3     assert n != 0, 'n is zero!'
4     return 10 / n
5 
6 def main():
7     foo('0')

 

assert的意味是,表明式n != 0应该是True,否则,依照程序运转的逻辑,后边的代码肯定会出错。

万一断言退步,assert语句小编就能够抛出AssertionError

1 $ python err.py
2 Traceback (most recent call last):
3   ...
4 AssertionError: n is zero!

 

次第中1经四方洋溢着assert,和print()比较能够不到哪去。可是,运行Python解释器时能够用-O参数来关闭assert

1 $ python -O err.py
2 Traceback (most recent call last):
3   ...
4 ZeroDivisionError: division by zero

 

关门后,你能够把具有的assert讲话当成pass来看。

法三:logging

assert比,logging不会抛出错误,而且能够输出到文件

1 import logging
2 logging.basicConfig(level=logging.INFO)
3 
4 s = '0'
5 n = int(s)
6 logging.info('n = %d' % n)
7 print(10 / n)

 

输出为:

1 $ python err.py
2 INFO:root:n = 0
3 Traceback (most recent call last):
4   File "err.py", line 8, in <module>
5     print(10 / n)
6 ZeroDivisionError: division by zero

 

这就是logging的好处,它允许你指定记录信息的级别,有debug,info,warning,error等几个级别,当我们指定level=INFO时,logging.debug就不起作用了。同理,指定level=WARNING后,debug和info就不起作用了。这样一来,你可以放心地输出不同级别的信息,也不用删除,最后统一控制输出哪个级别的信息。

法四:pdb(启动Python的调试器pdb,让程序以单步方式运行,可以随时查看运行状态。)

程序代码为:

1 s = '0'
2 n = int(s)
3 print(10 / n)

然后启动:

1 $ python -m pdb err.py
2 > /Users/michael/Github/learn-python3/samples/debug/err.py(2)<module>()
3 -> s = '0'

 

以参数-m pdb启航后,pdb定位到下一步要执行的代码-> s = '0'。输入指令l来查阅代码

1 (Pdb) l
2   1     # err.py
3   2  -> s = '0'
4   3     n = int(s)
5   4     print(10 / n)

 

输入指令n能够单步实施代码

1 (Pdb) n
2 > /Users/michael/Github/learn-python3/samples/debug/err.py(3)<module>()
3 -> n = int(s)
4 (Pdb) n
5 > /Users/michael/Github/learn-python3/samples/debug/err.py(4)<module>()
6 -> print(10 / n)

 

其余时候都得以输入指令p 变量名来查看变量

1 (Pdb) p s
2 '0'
3 (Pdb) p n
4 0

 

输入指令q甘休调节和测试,退出程序

1 (Pdb) q

 

这种经过pdb在命令行调节和测试的艺术理论上是万能的,但实在是太难为了,假诺有1000行代码,要运维到第89九行得敲多少命令啊。

 

法五: pdb.set_trace()(那一个格局也是用pdb,可是无需单步施行,大家只需求import pdb,然后,在大概出错的地方放八个pdb.set_trace(),就足以安装一个断点)

1 # err.py
2 import pdb
3 
4 s = '0'
5 n = int(s)
6 pdb.set_trace() # 运行到这里会自动暂停
7 print(10 / n)

 

运作代码,程序会自动在pdb.set_trace()停顿并进入pdb调节和测试情况,能够用命令p查阅变量,恐怕用命令c后续运维

 1 $ python err.py 
 2 > /Users/michael/Github/learn-python3/samples/debug/err.py(7)<module>()
 3 -> print(10 / n)
 4 (Pdb) p n
 5 0
 6 (Pdb) c
 7 Traceback (most recent call last):
 8   File "err.py", line 7, in <module>
 9     print(10 / n)
10 ZeroDivisionError: division by zero

 

其一法子比一向开发银行pdb单步调试作用要高诸多,但也高不到哪去。

 

法六:IDE

若是要相比较爽地设置断点、单步实施,就需求2个支撑调节和测试作用的IDE。这段日子可比好的Python
IDE有:

Visual Studio Code:https://code.visualstudio.com/,需要安装Python插件。

PyCharm:http://www.jetbrains.com/pycharm/

其余,Eclipse加上pydev插件也能够调理Python程序。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

http://www.bkjia.com/Pythonjc/1284042.htmlwww.bkjia.comtruehttp://www.bkjia.com/Pythonjc/1284042.htmlTechArticlePython day 玖(6) 调试,pythonday
程序能叁次写完并符合规律运作的票房价值相当小,基本不超越壹%。总会有多样各个的bug须求校正。有的bug很简短,看看错误…

法1:用print()
函数,把恐怕格外的变量打字与印刷出来看

1 def foo(s):
2     n = int(s)
3     print('>>> n = %d' % n)
4     return 10 / n
5 
6 def main():
7     foo('0')
8 
9 main()

 施行后在输出中找找打字与印刷的变量值

1 $ python err.py
2 >>> n = 0
3 Traceback (most recent call last):
4   ...
5 ZeroDivisionError: integer division or modulo by zero

print()最大的坏处是他日还得删掉它,想想程序里随处都是print(),运维结果也会蕴藏众多垃圾堆新闻。

法二:断言(凡是用print()来辅协助调查看的地方,都能够用断言(assert)来顶替)

1 def foo(s):
2     n = int(s)
3     assert n != 0, 'n is zero!'
4     return 10 / n
5 
6 def main():
7     foo('0')

 

assert的乐趣是,表明式n != 0应该是True,不然,依照程序运维的逻辑,前边的代码肯定会出错。

假设断言战败,assert语句笔者就能抛出AssertionError

1 $ python err.py
2 Traceback (most recent call last):
3   ...
4 AssertionError: n is zero!

 

先后中只要四处充斥着assert,和print()对照能够不到哪去。不过,运营Python解释器时能够用-O参数来关闭assert

1 $ python -O err.py
2 Traceback (most recent call last):
3   ...
4 ZeroDivisionError: division by zero

 

关闭后,你能够把装有的assert讲话当成pass来看。

法三:logging

assert比,logging不会抛出荒唐,而且可以出口到文件

1 import logging
2 logging.basicConfig(level=logging.INFO)
3 
4 s = '0'
5 n = int(s)
6 logging.info('n = %d' % n)
7 print(10 / n)

 

输出为:

1 $ python err.py
2 INFO:root:n = 0
3 Traceback (most recent call last):
4   File "err.py", line 8, in <module>
5     print(10 / n)
6 ZeroDivisionError: division by zero

 

这就是logging的好处,它允许你指定记录信息的级别,有debug,info,warning,error等几个级别,当我们指定level=INFO时,logging.debug就不起作用了。同理,指定level=WARNING后,debug和info就不起作用了。这样一来,你可以放心地输出不同级别的信息,也不用删除,最后统一控制输出哪个级别的信息。

法四:pdb(启动Python的调试器pdb,让程序以单步方式运行,可以随时查看运行状态。)

程序代码为:

1 s = '0'
2 n = int(s)
3 print(10 / n)

下一场运营:

1 $ python -m pdb err.py
2 > /Users/michael/Github/learn-python3/samples/debug/err.py(2)<module>()
3 -> s = '0'

 

以参数-m pdb启航后,pdb定位到下一步要推行的代码-> s = '0'。输入指令l来查阅代码

1 (Pdb) l
2   1     # err.py
3   2  -> s = '0'
4   3     n = int(s)
5   4     print(10 / n)

 

输入指令n能够单步实行代码

1 (Pdb) n
2 > /Users/michael/Github/learn-python3/samples/debug/err.py(3)<module>()
3 -> n = int(s)
4 (Pdb) n
5 > /Users/michael/Github/learn-python3/samples/debug/err.py(4)<module>()
6 -> print(10 / n)

 

别的时候都足以输入指令p 变量名来查看变量

1 (Pdb) p s
2 '0'
3 (Pdb) p n
4 0

 

输入指令q甘休调节和测试,退出程序

1 (Pdb) q

 

这种通过pdb在命令行调节和测试的不二等秘书诀理论上是文武全才的,但事实上是太劳苦了,即使有一千行代码,要运转到第九9九行得敲多少命令啊。

 

法五: pdb.set_trace()(那一个主意也是用pdb,可是无需单步推行,我们只要求import pdb,然后,在只怕出错的地点放2个pdb.set_trace(),就能够设置叁个断点)

1 # err.py
2 import pdb
3 
4 s = '0'
5 n = int(s)
6 pdb.set_trace() # 运行到这里会自动暂停
7 print(10 / n)

 

运作代码,程序会自行在pdb.set_trace()暂停并跻身pdb调节和测试蒙受,能够用命令p翻开变量,或许用命令c承继运维

 1 $ python err.py 
 2 > /Users/michael/Github/learn-python3/samples/debug/err.py(7)<module>()
 3 -> print(10 / n)
 4 (Pdb) p n
 5 0
 6 (Pdb) c
 7 Traceback (most recent call last):
 8   File "err.py", line 7, in <module>
 9     print(10 / n)
10 ZeroDivisionError: division by zero

 

以此艺术比间接开发银行pdb单步调节和测试作用要高大多,但也高不到哪去。

 

法六:IDE

假定要比较爽地设置断点、单步实践,就须要叁个支撑调试效能的IDE。方今相比较好的Python
IDE有:

Visual Studio
Code:https://code.visualstudio.com/,需求设置Python插件。

PyCharm:http://www.jetbrains.com/pycharm/

另外,Eclipse加上pydev插件也得以调治Python程序。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相关文章