第 11 章 使用PDB进行调试
PDB是Python标准库自带的强大调试器,与其他Python调试器相比,PDB的主要优势在于,它是Python的一部分,PDB几乎可以在任何有Python的地方使用,包括嵌入Python语言的大型系统的专用环境,比如ESRI的ArcGIS地理信息系统。
PDB与其他调试工具不同,不是一个单独的程序,而是一个模块,可以将其导入到任何程序中,使用set_trace()函数在程序执行的任何时刻都可启动调试器。
>>> import pdb
>>> pdb.set_trace()
--Return--
> <stdin>(1)<module>()->None
(Pdb)
在执行set_trace()之后,提示会从三箭头变成(pdb)——通过这个可以知道已经进入调试器。
11.1 调试命令
首先通过输入help来查看调试器中可用的命令:
(Pdb) help
Documented commands (type help <topic>):
========================================
EOF c d h list q rv undisplay
a cl debug help ll quit s unt
alias clear disable ignore longlist r source until
args commands display interact n restart step up
b condition down j next return tbreak w
break cont enable jump p retval u whatis
bt continue exit l pp run unalias where
Miscellaneous help topics:
==========================
exec pdb
获得命令的特定帮助:
(Pdb) help continue
c(ont(inue))
Continue execution, only stop when a breakpoint is encountered.
命令名中的圆括号表示可以通过输入c、cont、或全部单词continue来激活continue命令。
11.2 调试回文程序
本节来调试一个简单的函数。函数is_palindrome()可接收一个整数,并确定整数是否是回文。回文是正序和反序一样的序列。
创建palindrome.py:
# palindrome.py
import unittest
def digits(x):
"""将整数转换为数字列表。
Args:
x:检查的数字
Returns:数字列表,按照“x”的顺序排列。
>>> digits(4586378)
[4, 5, 8, 6, 3, 7, 8]
"""
digs = []
while x != 0:
div, mod = divmod(x, 10)
digs.append(mod)
x = mod
return digs
def is_palindrome(x):
"""确定一个整数是否是回文。
Args:
x:需要进行回文检查的数字。
Returns:如果数字“x”是回文数字就返回True,否则返回False。
>>> is_palindrom(1234)
False
>>> is_palindrom(2468642)
True
"""
digs = digits(x)
for f, r in zip(digs, reversed(digs)):
if f != r:
return False
return True
class Tests(uni