02-调试技巧
本章讲解 Python 调试的工具和技巧。
print 调试
f-string 调试
python
# Python 3.8+
name = "Alice"
age = 30
print(f"{name=}") # 输出:name='Alice'
print(f"{age=}") # 输出:age=30
print(f"{len([1,2,3])=}") # 输出:len([1,2,3])=3assert 断言
python
def calculate_discount(price: float, discount: float) -> float:
# 参数验证
assert price >= 0, "Price must be non-negative"
assert 0 <= discount <= 1, "Discount must be between 0 and 1"
final_price = price * (1 - discount)
return final_pricepdb 调试器
基础用法
python
import pdb
def buggy_function(x, y):
result = x + y
pdb.set_trace() # 设置断点
result = result * 2
return result常用命令
| 命令 | 说明 |
|---|---|
| n | 执行下一行 |
| s | 进入函数 |
| c | 继续执行 |
| l | 显示代码 |
| p | 打印变量 |
| q | 退出调试 |
breakpoint() 快捷方式
python
# Python 3.7+
def process_data(data):
breakpoint() # 等价于 pdb.set_trace()
return data * 2高级调试工具
ipdb(增强版 pdb)
bash
uv add --dev ipdbpython
import ipdb
ipdb.set_trace()rich 调试
bash
uv add --dev richpython
from rich import print
from rich.traceback import install
install() # 安装富 traceback异常调试
捕获和记录异常
python
import logging
logger = logging.getLogger(__name__)
def risky_operation():
try:
result = do_something()
return result
except Exception as e:
logger.exception("Operation failed")
raise调试最佳实践
✅ 推荐做法
- 使用 logging 而非 print
- 在生产环境禁用 assert
- 记录异常时包含完整堆栈
- 使用断点缩小问题范围
❌ 避免
- 在生产代码中遗留断点
- 使用空的 except 块
- 忽略异常不处理
本章小结
┌─────────────────────────────────────────────────────────────┐
│ 调试技巧 知识要点 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 基础调试: │
│ ✓ f-string 调试:{name=} │
│ ✓ assert 断言验证 │
│ │
│ pdb 调试器: │
│ ✓ breakpoint() 设置断点 │
│ ✓ n/s/c/l/p 命令 │
│ │
│ 高级工具: │
│ ✓ ipdb 增强调试 │
│ ✓ rich 美化输出 │
│ │
└─────────────────────────────────────────────────────────────┘