全网最实用的 Debug调试技巧汇总-Python大佬偷偷使用的神技

原文链接: https://jq.qq.com/?_wv=1027&k=5ISYZ9b

1.什么是debug?

  • 找茬
  • 找软件的茬
  • 发现程序的缺陷

2.为什么需要debug?

谁都不敢保证,写的代码没有任何问题
高效查找软件异常
一位优秀的开发工程师
20%的时间写代码
80%的时间用来排错
“不会debug” == “不会代码” == “低工资”

3.debug工具需要具备哪些功能?

控制程序的执行
想停则停,想执行则执行
随心所欲
设置断点
在指定位置停止
查看当前命名空间(程序栈)中变量

二、Python中的Debug大法

案例代码如下所示:

创建deubg_skills_demo.py文件

import time

from DebugSkills.gifts import send_gift
'''
遇到不懂的问题?Python学习交流群:821460695满足你的需求,资料都已经上传群文件,可以自行下载!
'''

def say_love(name, talk):
    print(f"{name}: {talk}!")
    print(show(3))
    print(f"{send_gift()}, 能代表我的心!")


def show(num):
    print(f"{'轰隆' * num}!")
    print(f"{'⚡' * num}")
    return "还敢再发誓吗?"


def long_long_ago(name, talk):
    # breakpoint()
    print("\nlong long ago...")
    print("当初没被雷劈死的原因既然是爱错了那个她/他")
    print(f"{name}: {talk}!")
    print(show(4))
    print(f"{send_gift()}, 能代表我的心!")


if __name__ == '__main__':
    lover = input("请输入你爱的人: ")
    love_talk = input("请输入爱的箴言: ")
    # 方法一:
    # import pdb
    # pdb.set_trace()

    # 方法二:
    # breakpoint()
    breakpoint()
    say_love(lover, love_talk)
    time.sleep(5)
    lover = input("\n请输入你爱的人: ")
    love_talk = input("请输入爱的箴言: ")
    long_long_ago(lover, love_talk)

创建gifts.py文件

import random

gifts = ["99朵玫瑰", "钻戒", "马尔代夫三十日游",
         "北京二环内的一套厕所", "玛莎拉蒂车钥匙",
         "免费自行车司机"]


def send_gift():
    """
    送礼物
    :return:
    """
    one_gift = random.choice(gifts)
    return one_gift

1.pdb操作

  • 系统自带的debug工具(无需安装)

  • 将以下代码放在需要调试的地方(类似于设置断点)

# 通用方法
import pdb; pdb.set_trace()

# Python3.6以上版本
breakpoint()

当程序执行到上述代码所在位置时,会自动开启一个console终端

"->"是接下来要执行的代码(当前还未执行)

全网最实用的 Debug调试技巧汇总-Python大佬偷偷使用的神技_第1张图片
可以在终端运行的命令

list或者l

显示当前运行的代码
默认列出11行代码
全网最实用的 Debug调试技巧汇总-Python大佬偷偷使用的神技_第2张图片
p 变量名 或者 p 需要运行的表达式

打印变量的值
在这里插入图片描述
step或者s

如果在函数调用处执行,则会进入函数体内部
全网最实用的 Debug调试技巧汇总-Python大佬偷偷使用的神技_第3张图片
全网最实用的 Debug调试技巧汇总-Python大佬偷偷使用的神技_第4张图片
全网最实用的 Debug调试技巧汇总-Python大佬偷偷使用的神技_第5张图片
next或者n

如果在函数调用处执行,则不会进入函数体内部
全网最实用的 Debug调试技巧汇总-Python大佬偷偷使用的神技_第6张图片
enter

重复执行上一次的命令
b(reak) [ ([filename:]lineno | function) [, condition] ]

设置断点
filename可选,如果不传,默认在当前文件设置断点
全网最实用的 Debug调试技巧汇总-Python大佬偷偷使用的神技_第7张图片
全网最实用的 Debug调试技巧汇总-Python大佬偷偷使用的神技_第8张图片
c或者continue

继续往下运行,在下一个断点处停下来
全网最实用的 Debug调试技巧汇总-Python大佬偷偷使用的神技_第9张图片
isable 断点编号

禁用断点
全网最实用的 Debug调试技巧汇总-Python大佬偷偷使用的神技_第10张图片
enable 断点编号

启用断点
cl或者clear 断点编号

清除断点
全网最实用的 Debug调试技巧汇总-Python大佬偷偷使用的神技_第11张图片
display或者undisplay 变量

监听或者不监听某个变量
如果变量值改变,会自动显示
全网最实用的 Debug调试技巧汇总-Python大佬偷偷使用的神技_第12张图片
h或者help

帮助信息
全网最实用的 Debug调试技巧汇总-Python大佬偷偷使用的神技_第13张图片
h 具体命令
具体命令的帮助文档

h pdb
pdb的完整文档

三、Pycharm debug操作

全网最实用的 Debug调试技巧汇总-Python大佬偷偷使用的神技_第14张图片
1.打开Python Prompt
全网最实用的 Debug调试技巧汇总-Python大佬偷偷使用的神技_第15张图片
会出现一个ipython的控制台

可在控制台查看当前命名空间中的变量
也可执行Python表达式
全网最实用的 Debug调试技巧汇总-Python大佬偷偷使用的神技_第16张图片
2.Step Over / F8
按调试工具栏中的
全网最实用的 Debug调试技巧汇总-Python大佬偷偷使用的神技_第17张图片
类似于pdb中的next
程序不会进入到函数体内部

3.Step Into / F7
按调试工具栏中的
全网最实用的 Debug调试技巧汇总-Python大佬偷偷使用的神技_第18张图片
类似于pdb中的step
程序会进入到函数(方法)体内部、系统源码、第三方模块源码中

4.Step Out / Shift+F8
从函数体内部跳出
全网最实用的 Debug调试技巧汇总-Python大佬偷偷使用的神技_第19张图片
5.Step Into My Code / ALT+Shift+F7
按调试工具栏中的
全网最实用的 Debug调试技巧汇总-Python大佬偷偷使用的神技_第20张图片
主要关注自己写的代码
从系统源码、第三方模块源码中跳到自己写的代码中
6.Evaluate Expression
全网最实用的 Debug调试技巧汇总-Python大佬偷偷使用的神技_第21张图片
在当前命名空间内计算表达式的值

7.Quick Evaluate Expression
快速计算表达式的值
全网最实用的 Debug调试技巧汇总-Python大佬偷偷使用的神技_第22张图片
全网最实用的 Debug调试技巧汇总-Python大佬偷偷使用的神技_第23张图片
全网最实用的 Debug调试技巧汇总-Python大佬偷偷使用的神技_第24张图片
8.Watching
全网最实用的 Debug调试技巧汇总-Python大佬偷偷使用的神技_第25张图片
类似于pdb中的display
可以监听某个变量或者表达式的值

你可能感兴趣的:(Python)