Python 代码 Debug 的 10 个实用技巧

科技   2024-11-29 08:30   上海  


我们日常写代码过程中,难免会写出各类错误,这些错误可能是语法错误、逻辑错误或运行时错误。我们可以使用最复杂的答案是来检测到错误。也可以通过仔细阅读回溯、使用调试工具、使用 linters 进行静态分析以及运行测试来检测错误,确保在运行之前和运行期间识别问题。

1.使用print语句进行调试

使用print语句进行调试就像在你要去的路上放置路标,我个人在我的隐喻中相信这一点

就像路标引导你并告诉你身在何处一样,代码中的打印语句会显示变量的当前值以及程序执行到的位置。

通过检查这些“路标”,你可以确定自己是否走在正确的道路上或是否出了问题。

 print(f"Hello, World!\n");

在代码的关键点插入print()语句以输出变量值并跟踪执行流程。这可以帮助你了解不同阶段发生的情况。

例如:

我们在行中使用了print语句作为路径(代码流)上的路标,告诉你你在哪里以及发生了什么。如果出现问题,你可以使用这些检查点来找出路径(代码)将你引入歧途的地方。

def hiking_trip(start, destination):
    print(f"从{start}开始徒步。")  # 路标 1
    midpoint = (start + destination) / 2
    print(f"到达中点:{midpoint}.")  # 路标 2
    if midpoint > 50:
        print("The midpoint is quite far!")  # 路标 3
    print(f"继续前往目的地:{destination}.")  # 路标 4
    return destination

hiking_trip(0100)

2.利用Python的内置pdb模块

使用 Python 的pdb模块就像暂停电影并逐帧播放。

就像你可以暂停、倒带或快进电影来查看正在发生的事情一样,pdb 可让你随时暂停代码,检查正在发生的事情,并一步一步地浏览代码。这样,你可以仔细检查代码的每个部分,以找出可能出错的地方。

使用该pdb模块设置断点并以交互方式逐步执行代码。首先插入import pdb; pdb.set_trace()要暂停执行的位置。

命令

python -m pdb your_script.py

例如:

例如,通过添加pdb.set_trace()到你的程序中,执行将在该行停止,从而允许你与提示符进行交互pdb。一旦到达提示符。

import pdb 
def example_function(x, y ): 
    result = x + y 
    pdb.set_trace()   # 执行将在此处暂停
    print(f"结果是{result}"
    return result 

example_function(35)

你可以使用各种命令来调试,例如:

n:转到下一行代码。
s:进入函数调用。
c:继续执行,直到下一个断点。

3.利用IDE调试器

使用 IDE 调试器就像在观看电影时拥有一个具有高级功能的遥控器。

你可以暂停、跳过场景并查看幕后细节,IDE 调试器可以让你设置断点、检查变量并以可视化的方式控制代码流程。

利用 PyCharm 或 VSCode 等 IDE 中的内置调试器。这些工具提供了用于设置断点、检查变量和逐步执行代码的图形界面。

例如:

在 PyCharm 或 VSCode 等 IDE 中调试程序时,你可以在代码中所需的关键点设置断点,类似于在重要场景暂停电影。随时彻底检查变量,就像看到电影幕后的细节一样。一次执行一行代码,就像使用遥控器在电影中逐帧跳过一样。

def movie_scene(start, end): 
    scene_duration = end - start   # 这是代码的“电影长度”
    important_event = start + scene_duration // 2   #“电影”的中点
    return f"重要事件发生在{important_event}秒。"

 movie_scene( 0 , 120 )

当调试器暂停执行时,你将能够执行以下命令:

检查startend的值。
看看scene_duration评估结果是什么。
跨到下一行进行计算important_event

4.利用日志记录获取更好的洞察力

使用日志记录而不是打印语句就像保存详细的日记而不是便签。

如果你需要快速记账,可以使用打印语句,它可以像便签一样工作,便签可以为你提供快速提醒,而日记(记录)可以让你记录不同级别的细节,从随意的观察到关键问题。

日志记录稍微复杂一些。你可以根据日志的重要性查看它们,并调整要查看的详细信息,从而帮助你更系统地跟踪代码中发生的情况。

import logging
logging.basicConfig(level=logging.DEBUG) 
logging.debug('这是一条调试消息')

用 Python 的模块替换print()语句logging。日志可以记录不同级别的消息(DEBUG、INFO、WARNING、ERROR、CRITICAL),并控制显示的详细信息量。例如:

DEBUG:详细信息,用于诊断问题。
INFO:确认一切如预期进行。
WARNING:表示发生了意外的事情,但是程序仍然在运行。
ERROR:更严重的问题,程序可能无法继续运行。
CRITICAL:一个严重的问题,意味着该程序可能无法继续运行。

import logging

# 配置日志记录以显示所有级别
logstash.basicConfig(level=logging.DEBUG) 

def hill_log ( start, destination ): 
    logstash.info(f"从{start}开始徒步到{destination}。")   # 正常流程的 INFO 级别
    midpoint = (start + destination) / 2
    logstash.debug(f"中点在{midpoint}。")   # 详细信息的 DEBUG 级别
    if midpoint > 50 : 
       logstash.warning("中点比预期的远!")   # 潜在问题的 WARNING 级别
    if destination - start > 100 : 
        logstash.error("这次徒步太长了!")   # 重大问题的错误级别
    if destination - start > 200 : 
        logstash.critical("不可能徒步!目的地太远!")   # 严重问题的 CRITICAL 级别
    return destination 

hill_log(0, 250)

在此示例中,你可以看到每个日志级别如何更加井然有序,并帮助你根据重要性显示信息,就像日记一样,它能让你理清自己的旅程。此外,它还能让你随时筛选或查看日志,print这比在代码中到处写语句(便签)要强大得多。我强烈推荐初学者使用这个!

5.仔细检查回溯

仔细检查回溯就像跟着地图去寻找你在徒步旅行中迷路的地方一样。

地图(回溯)显示你所走的确切路径,并突出显示出错的地方。通过在地图上仔细追溯你的步骤,你可以准确地找出错误发生的位置并了解导致错误的原因,从而帮助你回到正轨。

仔细阅读错误消息的完整回溯。它们提供了有关错误发生位置和原因的详细信息,可帮助你查明问题所在。

Traceback(most recent call last):
  File "example.py", line 8, in <module>
    main()
  File "example.py", line 5, in main
    result = divide_numbers(x, y)
  File "example.py", line 2, in divide_numbers
    return a / b
ZeroDivisionError: division by zero

ZeroDivisionError: division by zero
–– –– 实际的错误信息。

6.使用tryexcept进行错误处理

使用tryexcept进行错误处理就像攀爬时佩戴安全带。

安全带(try 块)允许你继续攀爬(代码执行),但如果你滑倒(发生错误),安全带会抓住你(except 块),防止跌落(程序崩溃)。这样,你就可以安全地浏览代码中的危险部分,而不会突然停止一切。

将可能引发错误的代码包装在try块中,并使用except块处理异常。这可以帮助你管理和理解错误,而不会导致程序崩溃。

例子

try:    
 risky_code() 
except Exception as e:    
print(f"An error occurred: {e}")

7. 用类型检查

就像在开始烹饪之前要检查配料是否正确且数量正确一样,类型检查可在运行代码之前确保变量和函数具有正确的类型。这可以帮助你尽早发现潜在的混淆(类型相关错误),防止问题在以后破坏你的程序。

使用类型提示和工具mypy执行静态类型检查并在运行之前捕获类型相关的错误。

命令

mypy your_script.py

8.使用断言进行测试

你使用断言检查代码中的条件在特定点是否正确。如果某些东西看起来不自然,断言会立即捕捉到它,帮助你发现并修复逻辑错误,以免它们造成更大的问题。

使用assert语句来验证代码中各个点的条件是否成立。断言可以帮助尽早发现逻辑错误。

例子

assert x > 0"x must be positive"

9.使用 Linters 分析代码

使用 linters 分析代码就像对你的写作进行语法检查一样。

就像语法检查器会突出显示文本中的错误、不恰当的措辞和风格问题一样,

linter 会扫描你的代码,查找语法错误、 编码风格违规和潜在错误。这有助于你清理代码,使其更易读、更一致且无错误。

使用 pylint 或 flake8 等 linters来捕捉语法错误、文体问题和潜在错误。

命令pylint your_script.py

10. 使用代码分析器进行监控

使用代码分析器就像使用健身追踪器来监控你的锻炼一样。

为什么我要对健身追踪器说这些,因为就像健身追踪器可以测量你的表现,识别需要改进的地方,并在需要时为你提供指导一样,代码分析器也可以跟踪同样的工作。你的程序如何运行并突出显示其运行速度变慢或遇到问题的地方。这有助于你优化代码并提高其效率。

使用分析工具cProfile来测量代码的性能并识别可能导致意外行为的瓶颈或区域。

命令python -m cProfile your_script.py

写在最后

在本文中,我们探讨了识别代码或项目中的错误的各种方法和做法。无论你是初学者还是大佬级,这些技巧对于发现错误都非常有用。我们介绍了十种不同的技巧,每种技巧都用简单的类比来解释,以帮助你掌握基础知识。

一个数据人的自留地
数据人交流和学习的社区,关注我们,掌握专业数据知识、结识更多的数据小伙伴。
 最新文章