還記得在上一個(gè)教程中,你創(chuàng)建并運(yùn)行了 Car 腳本嗎?讓我們?cè)俸退嬉粫?huì)兒。
在運(yùn)行工具窗口中運(yùn)行腳本,加速一次汽車,然后通過輸入相應(yīng)的命令進(jìn)行兩次制動(dòng):
現(xiàn)在按 o
然后按 Enter
來顯示汽車的里程表:
腳本告訴我們汽車行駛了 0 公里!這是一個(gè)意外的結(jié)果,因?yàn)槲覀儼戳艘淮渭铀倨鳎云噾?yīng)該已經(jīng)行駛了一段距離。讓我們調(diào)試代碼以找出原因。
要開始調(diào)試,你必須先設(shè)置一個(gè)斷點(diǎn)。調(diào)試器將在執(zhí)行帶有斷點(diǎn)的行之前停止,這樣你就可以檢查程序的當(dāng)前狀態(tài)。
汽車的里程表設(shè)置在第 15 行,所以讓我們?cè)谀抢镌O(shè)置一個(gè)斷點(diǎn)。點(diǎn)擊行號(hào)旁邊的空白處:
接下來,點(diǎn)擊 main
子句旁邊的
圖標(biāo),然后選擇調(diào)試 'car'(Debug `car`)。
PyCharm 開始調(diào)試會(huì)話并顯示調(diào)試工具窗口。
按 a
然后按 Enter
來加速汽車。調(diào)試器將執(zhí)行腳本并在斷點(diǎn)處停止。調(diào)試工具窗口的線程和變量標(biāo)簽頁將打開。展開 self
以檢查變量的當(dāng)前值:
點(diǎn)擊調(diào)試工具欄上的
“單步跳過(Step Over)” 按鈕,以執(zhí)行帶有斷點(diǎn)的行。注意 ?
? 的值變?yōu)?5,第 16 行現(xiàn)在在編輯器中高亮顯示,因?yàn)樗鼘⑹窍乱粋€(gè)要執(zhí)行的行:里程表(
?odometer
?)
現(xiàn)在點(diǎn)擊
“繼續(xù)(Resume)” 按鈕并切換到 Debug 調(diào)試工具窗口的控制臺(tái)標(biāo)簽頁。通過按
b
然后按 Enter
來指示汽車制動(dòng)?;氐骄€程和變量標(biāo)簽頁并檢查變量。注意此時(shí)速度為 0。
再次點(diǎn)擊 “繼續(xù)” 按鈕并再次制動(dòng)(
b
+ Enter
)?,F(xiàn)在,讓我們切換到線程和變量標(biāo)簽頁并分析接下來會(huì)發(fā)生什么:
你可以看到,里程表
的值是 5,速度
的值是 -5。這就是為什么當(dāng)我們恢復(fù)執(zhí)行時(shí),里程表
將變?yōu)?0。你可以點(diǎn)擊工具欄上的 按鈕來確認(rèn)這一點(diǎn)。
所以,意外結(jié)果的原因是 速度(speed)
變量的負(fù)值。
為了避免再次遇到同樣的問題,讓我們更新 Car
的 brake
方法,使其不會(huì)將 速度
減少到負(fù)值。
選擇 brake
方法中的語句 self.speed -= 5
,然后按 Ctrl
+ Alt
+ T
(代碼 -> 包圍Surround with)。
選擇 if 來為該語句添加條件。
PyCharm 創(chuàng)建了一個(gè)占位符 if 構(gòu)造,留下你來填充適當(dāng)?shù)膬?nèi)容。
輸入 self.speed >= 5
。我們?cè)诖a中指定了 brake
方法只有在 速度
大于或等于 5 時(shí)才扣除 5:
def brake(self):
if self.speed >=5:
self.speed -=5
那么速度低于 5 怎么辦?當(dāng)你在現(xiàn)實(shí)生活中對(duì)一輛緩慢行駛的汽車進(jìn)行制動(dòng)時(shí),它只是停下來。讓我們?cè)诖a中指定這一點(diǎn)。
在 brake
方法的最后一行后添加一行新代碼并開始輸入 el...
。PyCharm 提示你插入 else
。按 Enter
插入它,縮進(jìn)將自動(dòng)修復(fù):
現(xiàn)在添加 self.speed = 0
以指定汽車應(yīng)該停止。以下是更新后的 brake
方法代碼:
def brake(self):
if self.speed >=5:
self.speed -=5
else:
self.speed =0
讓我們?cè)俅芜\(yùn)行以檢查是否成功修復(fù)了問題。加速汽車,然后進(jìn)行兩次制動(dòng),并檢查里程表:
現(xiàn)在我們得到了預(yù)期的正確結(jié)果。
調(diào)試工具窗口由用于幀、變量和觀察的專用窗格以及顯示所有輸入和輸出信息的控制臺(tái)標(biāo)簽頁組成。如果你想讓控制臺(tái)始終可見,可以將其拖到 PyCharm 窗口的邊緣之一。
如果你想一行一行地查看代碼的執(zhí)行情況,無需在每一行都設(shè)置斷點(diǎn),可以逐步執(zhí)行代碼。
讓我們看看在示例程序中逐步執(zhí)行是什么樣子。通過窗口頂部的運(yùn)行小部件啟動(dòng)或重新啟動(dòng)調(diào)試器:
在打開的調(diào)試器控制臺(tái)中,按 a
加速汽車。調(diào)試器將在斷點(diǎn)處停止。
我們可以使用逐步調(diào)試工具欄按鈕來選擇下一步在哪個(gè)行停止。
例如,點(diǎn)擊單步跳過(Step Over) 按鈕,查看藍(lán)色標(biāo)記移動(dòng)到下一行代碼:
繼續(xù)點(diǎn)擊 ,直到到達(dá)
action = input("What should I do? [A]ccelerate, [B]rake, " "show [O]dometer, or show average [S]peed?").upper()
。
現(xiàn)在,如果你點(diǎn)擊單步進(jìn)入(Step Into)按鈕,你會(huì)看到調(diào)試器進(jìn)入 parse.py 文件:
但是,如果你繼續(xù)使用單步跳過 ,你會(huì)看到你的應(yīng)用程序只是繼續(xù)下一個(gè)循環(huán):
如果你想專注于自己的代碼,使用單步進(jìn)入我的代碼(Step Into My Code)按鈕。這樣你將避免進(jìn)入庫類。
有關(guān)更多信息,請(qǐng)參考逐步調(diào)試工具欄和單步調(diào)試程序。
PyCharm 允許你觀察任何變量。只需在評(píng)估表達(dá)式或在線程和變量標(biāo)簽頁下的工具欄下方的添加觀察字段中輸入要觀察的變量名稱。例如,my_car.time
。這里提供代碼補(bǔ)全。然后點(diǎn)擊字段右側(cè)的。
然后轉(zhuǎn)到控制臺(tái)標(biāo)簽頁并輸入任何命令,例如,b
。
當(dāng)你回到線程和變量標(biāo)簽頁時(shí),你會(huì)看到 my_car.time
的當(dāng)前值:
有關(guān)更多信息,請(qǐng)參考觀察。
你可能已經(jīng)注意到 PyCharm 的另一個(gè)功能,它使查看代碼執(zhí)行情況變得更加容易:內(nèi)聯(lián)調(diào)試器。只要你按下任何斷點(diǎn),PyCharm 就會(huì)在編輯器中顯示許多變量的值:
此內(nèi)聯(lián)調(diào)試功能默認(rèn)啟用。如果你沒有看到內(nèi)聯(lián)調(diào)試值,請(qǐng)檢查它是否在調(diào)試器設(shè)置中啟用。點(diǎn)擊調(diào)試器(Debugger)工具欄上的,然后選擇調(diào)試器設(shè)置(Debugger Settings )。確保在編輯器中顯示變量值(Show Variable Values in Editor)已啟用。
所以,你已經(jīng)做到了!恭喜!讓我們回顧一下你在 PyCharm 的幫助下所做的事情:
更多建議: