16.7.2.2 检查栈中的变量
栈中的各个帧会唯护一组变量,包括所执行函数的局部值和全局状态信息。pdb提供了多种方法来检查这些变量的内容。
#!/usr/bin/env python3
# encoding: utf-8
#
# Copyright (c) 2019 Iglesias. All rights reserved.
#
import pdb
def recursive_function(n=5,output='to be printed'):
if n > 0:
recursive_function(n - 1)
else:
pdb.set_trace()
print(output)
return
if __name__ == '__main__':
recursive_function()
args命令(缩写为a)会打印当前帧中活动函数的所有参数。这个例子还使用了一个递归函数,可以显示where打印内容时的一个更深的栈。
p命令会评估作为参数给定的一个表达式,并打印结果。也可以使用Python的print()函数,不过要把它传递到解释器执行,而不是在调试工具中作为一个命令运行。
类似地,在一个表达式前面加上前缀!就会把它传递到Python解释器进行评估。这个特性可以用来执行任意的Python语句,包括修改变量。下面这个例子在允许调试工具继续运行程序之前会修改output的值。set_tracec()调用后的下一条语句在打印output的值时会显示修改后的值。
对于更复杂的值,如嵌套数据结构或大型数据结构,要使用pp以“完美打印”的格式来打印。下面这个程序从一个文件读取多个文本行。
#!/usr/bin/env python3
# encoding: utf-8
#
# Copyright (c) 2019 Iglesias. All rights reserved.
#
import pdb
with open('lorem.txt','rt') as f:
lines = f.readlines()
pdb.set_trace()
用p打印变了lines时,得到的输出很难读,因为它的换行很糟糕。pp使用pprint格式化值,从而能更美观地打印。
对于交互式探索和试验,可以从调试工具回到标准的Python交互式提示窗口(已经填充当前帧的全局和局部值)。
交互式解释器可以改变类似列表可变对象。与之相反,不可变的对象是不能改变的,它们的名字不能被重新绑定到新值。
使用文件结束序列Ctrl-D退出交互式提示窗口,并返回到调试工具。在这个例子中,列表l已经改变,但是m和n的值没有改变。