在 PyCharm 中调试你的第一个 Python 应用程序
找出问题的根源
还记得在上一个教程中,你创建并运行了 Car 脚本吗?让我们再和它玩一会儿。
在运行工具窗口中运行脚本,加速一次汽车,然后通过输入相应的命令进行两次制动:
现在按 o
然后按 Enter
来显示汽车的里程表:
脚本告诉我们汽车行驶了 0 公里!这是一个意外的结果,因为我们按了一次加速器,所以汽车应该已经行驶了一段距离。让我们调试代码以找出原因。
要开始调试,你必须先设置一个断点。调试器将在执行带有断点的行之前停止,这样你就可以检查程序的当前状态。
汽车的里程表设置在第 15 行,所以让我们在那里设置一个断点。点击行号旁边的空白处:
接下来,点击 main
子句旁边的
图标,然后选择调试 'car'(Debug `car`)。
PyCharm 开始调试会话并显示调试工具窗口。
按 a
然后按 Enter
来加速汽车。调试器将执行脚本并在断点处停止。调试工具窗口的线程和变量标签页将打开。展开 self
以检查变量的当前值:
点击调试工具栏上的
“单步跳过(Step Over)” 按钮,以执行带有断点的行。注意
的值变为 5,第 16 行现在在编辑器中高亮显示,因为它将是下一个要执行的行:里程表(
odometer
)
现在点击
“继续(Resume)” 按钮并切换到 Debug 调试工具窗口的控制台标签页。通过按
b
然后按 Enter
来指示汽车制动。回到线程和变量标签页并检查变量。注意此时速度为 0。
再次点击 “继续” 按钮并再次制动(
b
+ Enter
)。现在,让我们切换到线程和变量标签页并分析接下来会发生什么:
你可以看到,里程表
的值是 5,速度
的值是 -5。这就是为什么当我们恢复执行时,里程表
将变为 0。你可以点击工具栏上的 按钮来确认这一点。
所以,意外结果的原因是 速度(speed)
变量的负值。
修复问题
为了避免再次遇到同样的问题,让我们更新 Car
的 brake
方法,使其不会将 速度
减少到负值。
选择 brake
方法中的语句 self.speed -= 5
,然后按 Ctrl
+ Alt
+ T
(代码 -> 包围Surround with)。
选择 if 来为该语句添加条件。
PyCharm 创建了一个占位符 if 构造,留下你来填充适当的内容。
输入 self.speed >= 5
。我们在代码中指定了 brake
方法只有在 速度
大于或等于 5 时才扣除 5:
def brake(self):
if self.speed >=5:
self.speed -=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 文件:
但是,如果你继续使用单步跳过 ,你会看到你的应用程序只是继续下一个循环:
如果你想专注于自己的代码,使用单步进入我的代码(Step Into My Code)按钮。这样你将避免进入库类。
有关更多信息,请参考逐步调试工具栏和单步调试程序。
观察
PyCharm 允许你观察任何变量。只需在评估表达式或在线程和变量标签页下的工具栏下方的添加观察字段中输入要观察的变量名称。例如,my_car.time
。这里提供代码补全。然后点击字段右侧的。
然后转到控制台标签页并输入任何命令,例如,b
。
当你回到线程和变量标签页时,你会看到 my_car.time
的当前值:
有关更多信息,请参考观察。
内联调试
你可能已经注意到 PyCharm 的另一个功能,它使查看代码执行情况变得更加容易:内联调试器。只要你按下任何断点,PyCharm 就会在编辑器中显示许多变量的值:
此内联调试功能默认启用。如果你没有看到内联调试值,请检查它是否在调试器设置中启用。点击调试器(Debugger)工具栏上的,然后选择调试器设置(Debugger Settings )。确保在编辑器中显示变量值(Show Variable Values in Editor)已启用。
总结
所以,你已经做到了!恭喜!让我们回顾一下你在 PyCharm 的帮助下所做的事情:
- 找出问题的根源
- 设置断点
- 逐步执行程序
- 创建观察
- 评估表达式
更多建议: