调试您的第一个 Python 应用程序
最后修改时间:2023 年 9 月 6 日找出问题的根源
还记得在上一个教程中您已经创建并运行了Car脚本吗?让我们再玩一点。
运行脚本,将汽车加速一次,然后在运行工具窗口中输入相应的命令来制动两次:

现在按o
,然后按显示汽车的里程表:Enter

脚本告诉我们汽车已经行驶了 0 公里!这是一个意想不到的结果,因为我们已经踩过一次油门,所以汽车应该已经行驶了一段距离。让我们调试一下代码来找出原因。
要开始调试,必须先设置断点。调试器将在执行带有断点的行之前停止,您将能够检查程序的当前状态。
汽车的里程表设置在第 15 行,所以我们在那里放置一个断点。单击装订线中的行号:

接下来,单击子句旁边装订线中的图标
main
,然后选择Debug 'car'。

PyCharm 启动调试会话并显示调试工具窗口。

按下a
后可加速汽车。调试器将执行脚本并在断点处停止。调试工具窗口的线程和变量选项卡将打开。展开以检查变量的当前值:Enterself

单击调试器工具栏上的( Step Over ),以执行带有断点的行。请注意, 的值
odometer
变为 5,并且第 16 行现在在编辑器中突出显示,因为接下来将执行它:

现在单击( Resume ) 并切换到调试工具窗口中的控制台选项卡。依次按 和 来指示汽车制动。返回“线程和变量”选项卡并检查变量。请注意,此时速度为 0。
b
Enter

再次单击并制动 (
b
+ )。现在,让我们切换到“线程和变量”选项卡并分析接下来会发生什么:Enter

可以看到, 的值为odometer
5, 的值为speed
-5。这就是为什么当我们恢复执行时,odometer
将变为0。您可以单击工具栏上的 来确保它发生。
因此,意外结果的原因是变量的负值speed
。
解决问题
为了避免再次遇到同样的问题,让我们更新 ,brake
使其Car
不会减少speed
到负值。
self.speed -= 5
选择方法中的语句brake
,然后按( Code | Surround with ):CtrlAlt0T

选择是否向语句添加条件。
PyCharm 创建一个存根if
构造,让您负责用正确的内容填充它。

类型self.speed >= 5
。我们在代码中指定,该brake
方法只应在speed
大于或等于 5 时减去 5:

低于5的速度怎么办?当你在现实生活中刹车一辆缓慢行驶的汽车时,它就会停下来。让我们在代码中指定这一点。
在方法的最后一行后添加新行brake
并开始输入el...
。PyCharm 为您提供插入else
. 按下去插入,缩进会自动修复:Enter

现在添加self.speed = 0
以指定汽车应该停止。这是该方法的更新代码brake
:
def brake(self):
if self.speed >= 5:
self.speed -= 5
else:
self.speed = 0
让我们再次运行来检查是否已经解决了问题。加速汽车,然后制动两次,检查里程表:

现在我们得到了预期的正确结果。
详细调试
调试工具窗口由框架、变量和监视的专用窗格以及控制台选项卡组成,其中显示所有输入和输出信息。如果您希望控制台始终可见,可以将其拖动到 PyCharm 窗口的边缘之一。
踏步
如果您想逐行查看代码的作用,则无需在每一行上放置断点,您可以单步执行代码。
让我们看看单步执行示例程序是什么样子的。使用窗口顶部的“运行”小部件启动或重新启动调试器:

在打开的调试器控制台中,按下a
可加速汽车。调试器将在断点处停止。
我们可以使用步进工具栏按钮来选择下一步要停止的行。

例如,单击“Step Over”按钮,您会看到蓝色标记移至下一行代码:

继续单击,直到打开
action = input("What should I do? [A]ccelerate, [B]rake, " "show [O]dometer, or show average [S]peed?").upper()
。
现在,如果单击Step Into按钮,您将看到调试器进入文件parse.py:

但是,如果您继续使用,您将看到您的应用程序只是继续下一个循环:

如果您想专注于自己的代码,请使用“步入我的代码”按钮。这样你就可以避免进入库类。
观看
PyCharm 允许您观察任何变量。只需在“求值表达式”中键入要监视的变量名称,或在“线程和变量”选项卡的工具栏下添加监视字段即可。例如,。请注意,此处提供了代码完成功能。然后单击该字段的右边缘。my_car.time

然后转到“控制台”选项卡并键入任意命令,例如b
.
当您返回“线程和变量”选项卡时,您将看到以下值的当前值my_car.time
:

有关更多信息,请参阅手表。
内联调试
您可能已经注意到 PyCharm 的另一个功能可以让您轻松查看代码正在执行的操作: 内联调试器。一旦按下任何断点,PyCharm 就会在编辑器中显示许多变量的值:

默认情况下启用此 内联调试功能。如果您没有看到内联调试值,请检查它是否在调试器设置中启用。单击调试器工具栏上的 并选择调试器设置。确保启用了在编辑器中显示变量值。

概括
所以,你已经做到了!恭喜!让我们重复一下您在 PyCharm 的帮助下所做的事情:
找到了问题的根源
设置断点
单步执行您的程序
创建了一块手表
评估一个表达式
感谢您的反馈意见!