"代码报错了,怎么调试?"
新手:print() 打印一切 高手:pdb + 断点 + 日志 大师:AI 辅助调试
今天分享 5 个 Python 调试技巧,每一个都能让你少加班 1 小时。
1️⃣ print() 进阶用法
❌ 新手写法:
print("x =", x)print("y =", y)print("result =", result)
✅ 高手写法:
# Python 3.8+ 的调试神器x = 42y = 100result = x + yprint(f"{x=}") # x=42print(f"{y=}") # y=100print(f"{result=}") # result=142# 一行打印多个print(f"{x=}, {y=}, {result=}")
为什么更好:
2️⃣ pdb 断点调试
基础用法:
import pdbdefcalculate(a, b): pdb.set_trace() # 在这里断点 result = a + breturn resultcalculate(10, 20)
运行后进入交互模式:
$ python script.py> script.py(4)calculate()(Pdb) n # 执行下一行(Pdb) p a # 打印变量 a(Pdb) p b # 打印变量 b(Pdb) c # 继续执行(Pdb) q # 退出调试
常用命令:
3️⃣ logging 日志调试
❌ 新手写法:
print("开始执行")# ... 代码 ...print("执行完成")
✅ 高手写法:
import logging# 配置日志logging.basicConfig( level=logging.DEBUG,format='%(asctime)s - %(levelname)s - %(message)s')defprocess_data(data): logging.debug(f"处理数据:{data}")try: result = transform(data) logging.info(f"转换成功:{result}")return resultexcept Exception as e: logging.error(f"处理失败:{e}", exc_info=True)raise
日志级别:
logging.debug("调试信息") # 详细调试logging.info("一般信息") # 运行状态logging.warning("警告信息") # 潜在问题logging.error("错误信息") # 错误发生logging.critical("严重错误") # 系统崩溃
4️⃣ 装饰器调试
调试函数执行时间:
import timefrom functools import wrapsdeftiming(func): @wraps(func)defwrapper(*args, **kwargs): start = time.time() result = func(*args, **kwargs) end = time.time()print(f"{func.__name__} 执行时间:{end-start:.4f}s")return resultreturn wrapper@timingdefslow_function(): time.sleep(1)slow_function() # 输出:slow_function 执行时间:1.0012s
调试函数参数和返回值:
defdebug(func): @wraps(func)defwrapper(*args, **kwargs):print(f"调用 {func.__name__},参数:{args}, {kwargs}") result = func(*args, **kwargs)print(f"{func.__name__} 返回:{result}")return resultreturn wrapper@debugdefadd(a, b):return a + badd(3, 5)# 调用 add,参数:(3, 5), {}# add 返回:8
5️⃣ AI 辅助调试
把错误信息丢给 AI:
请帮我分析这个 Python 错误:Traceback (most recent call last): File "script.py", line 15, in <module> result = calculate(data) File "script.py", line 8, in calculate return sum(data) / len(data)ZeroDivisionError: division by zero代码:def calculate(data): return sum(data) / len(data)data = []result = calculate(data)
AI 的回复:
# 问题分析:# data 是空列表,len(data) = 0,导致除零错误# 修复方案:defcalculate(data):ifnot data: # 检查空列表return0# 或者抛出异常returnsum(data) / len(data)# 或者用异常处理:defcalculate(data):try:returnsum(data) / len(data)except ZeroDivisionError:return0# 或者 float('nan')
🎁 额外技巧:VS Code 调试
launch.json 配置:
{"version":"0.2.0","configurations":[{"name":"Python: 当前文件","type":"python","request":"launch","program":"${file}","console":"integratedTerminal","justMyCode":true}]}
调试操作:
📌 总结
| |
|---|
| print(f"{x=}") |
| pdb.set_trace() |
| logging |
| |
| |
记住:
调试不是浪费时间,是投资时间。
你最喜欢哪个调试技巧?评论区分享~