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 可以改变或禁用这个行为。它会改变执行流程,提交或部署前应清理,并避免在无人值守进程中意外停住。