跳到内容

第 0 卷 / 第 4 章 / 第 2 课

4.2 断点、变量与单步执行 ​

前置知识:准备可调试的开发环境

预计时间:12 分钟

练习环境:Python 3 与已选好的调试器

完成标志:能复现失败、在可执行行暂停并选择正确的单步动作

环境已经对齐,接下来才轮到业务错误。把下面的最小失败示例保存为 material_checker.py:

python
def get_qualified_items(items):
    # 需求:零重量占位件有效,负重量无效
    valid = []
    for item in items:
        if item["weight"] > 0:
            valid.append(item)
    return sorted(valid, key=lambda item: item["weight"], reverse=True)

items = [
    {"id": 1, "weight": 100},
    {"id": 2, "weight": 0},
    {"id": 3, "weight": -50},
]
assert [item["id"] for item in get_qualified_items(items)] == [1, 2]

先用 python3 material_checker.py 确认断言稳定失败,再在 if item["weight"] > 0 所在行设置断点。这里故意展开成普通循环,使 item 在常见 Python 调试器里更容易观察。断点通常在执行该源码步骤前暂停,但源码行与解释器实际执行步骤仍不保证一一对应。

暂停后看什么 ​

  • 当前栈帧属于哪个函数、线程和源文件?
  • 参数 items 是否为预期输入?
  • 零重量项计算 item["weight"] > 0 的结果是什么?
  • 当前解释器、工作目录和加载代码是否正确?

单步动作 ​

动作行为
Continue运行到下一暂停原因或结束
Step Over执行当前步骤,不主动进入其中的函数调用
Step Into尝试进入调用,可能进入库代码
Step Out继续运行当前函数直到返回调用者附近

快捷键随 IDE、系统和键位方案变化。VS Code 常见 F5/F10/F11/Shift+F11 只是默认值,不是跨工具标准。

本例约定每个输入都有数值类型的 weight,缺字段、字符串或 NaN 不在这个断言的覆盖范围内。当前样例的边界条件应改成 if item["weight"] >= 0:。修复后退出调试模式,再运行 python3 material_checker.py。调试观察帮助形成假设,测试才证明这个需求样例通过。

Python 还可在代码中临时写 breakpoint();默认配置通常会进入 pdb,但 PYTHONBREAKPOINT 可以改变或禁用这个行为。它会改变执行流程,提交或部署前应清理,并避免在无人值守进程中意外停住。

→ 下一步:条件断点与调用栈

Built with VitePress | Software Systems Atlas