Python 现代开发学习笔记

(三)断点、单步与变量观察

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 调试配置

笔记正文与全部题解 · Ctrl / ⌘ K