(三)断点、单步与变量观察
1. 在判断之前暂停
临时 print(repr(value), count) 可以看状态;想在同一次执行里继续查看调用者,可以用标准库调试器 pdb。内置 breakpoint() 默认进入它:
# 项目文件:debug_demo/pdb_goal.py
# 第二轮判断前暂停;检查时 count 仍为 0,比较动作还没执行。
def count_met(minutes, goal):
count = 0
for value in minutes:
if value == goal:
breakpoint()
if value > goal:
count += 1
return count
if __name__ == "__main__":
print(count_met([20, 35, 45], 35))运行后出现 (Pdb) 提示符。依次输入以下命令;这是调试器中的操作记录,不能复制到 .py 文件:
(Pdb) p value
35
(Pdb) p goal
35
(Pdb) p count
0
(Pdb) p value > goal
False
(Pdb) p value >= goal
True
(Pdb) c
1
p 表达式 查看表达式结果;n 执行当前行,在当前函数继续;s 可以进入被调用的 Python 函数;r 运行到当前函数返回;c 继续运行;l 查看附近源码;where 查看调用栈,up 与 down 切换查看的调用层,q 退出调试。n、s 都会实际执行代码,表达式里也能调用有副作用的函数,因此观察这一步先使用现有变量和比较表达式。Python 3.12 调试器
2. 在 VS Code 中跟踪同一个过程
在 goal_before.py 的 if value > goal 左侧行号旁设置断点,从“运行和调试”选择 Python 文件启动。编辑器使用第一章选定的项目 .venv 解释器。程序停在这行时,黄色指示表示下一步将执行的语句,变量面板展示此前已经执行出的状态。
第一次停下,value=20、count=0;继续后第二次停下,value=35、count=0。在“监视”加入 value >= goal 和 value > goal,会看到 True 与 False。单步越过后,计数仍然是 0,与表格中的第一处差异一致。
断点右键可以添加条件 value == goal,直接停在这次记录。F10 单步跳过、F11 单步进入、Shift+F11 跳出、F5 继续;“调用堆栈”可以选择调用者,查看它传入的列表。调试文件导入时,把当前工作目录和参数也写进工作区配置:
// 项目文件:quality_project/.vscode/launch.json
// 用项目解释器调试包入口,工作目录固定到项目根目录。
{
"version": "0.2.0",
"configurations": [
{
"name": "调试书籍库导入",
"type": "debugpy",
"request": "launch",
"module": "readingapp",
"cwd": "${workspaceFolder}",
"args": ["--db", "data/debug.sqlite3", "import-json", "data/books.json"],
"console": "integratedTerminal",
"justMyCode": true
}
]
}
module 对应后面项目的 python -m readingapp,args 是传给程序的参数,${workspaceFolder} 是 VS Code 打开的文件夹。先按本章项目步骤安装,再打开 quality_project 文件夹调试。需要进入测试中的断点时,也可以运行 python -m pytest --pdb,失败后进入调试器。VS Code Python 调试配置