亚洲熟女综合色一区二区三区,亚洲精品中文字幕无码蜜桃,亚洲va欧美va日韩va成人网,亚洲av无码国产一区二区三区,亚洲精品无码久久久久久久

調(diào)試你的Python代碼

調(diào)試你的Python代碼

譯自: http://howchoo.com/g/zgi2y2iwyze/debugging-your-Python-code 
作者: Ashley 
    當(dāng)你不得不更新別人的代碼時(shí),你有多少次陷入這樣一種境地?如果你是一個(gè)開(kāi)發(fā)團(tuán)隊(duì)的一員,那我猜一定多于你愿意的次數(shù)。 結(jié)果我們發(fā)現(xiàn)Python (和其他語(yǔ)言一樣)提供了在這種情況下便利的debug特性。愿這份快速指南能使你的生活輕松些。

1 一段糟糕的代碼

   出于本教程段目的讓我們假設(shè)如下一段簡(jiǎn)單段程序。這段程序獲取兩個(gè)命令行參數(shù)以及加減操作。 (讓我們假設(shè)用戶輸入的參數(shù)無(wú)誤,因此無(wú)需處理異常)

import sys
def add(num1=0, num2=0):
    return int(num1) + int(num2)
def sub(num1=0, num2=0):
    return int(num1) - int(num2)
def main():
    #Assuming our inputs are valid numbers
    print sys.argv
    addition = add(sys.argv[1], sys.argv[2])
    print addition
    subtraction = sub(sys.argv[1], sys.argv[2])
    print subtraction
if __name__ == '__main__':
    main()

2 加入pdb

Python自帶了名為pdb的,基于交互的源碼debug模塊。
你需要已如下方式啟用該模塊。 

import pdb
pdb.set_trace()

 加入斷點(diǎn)(break points) 的示例程序:

import pdb
import sys
def add(num1=0, num2=0):
    return int(num1) + int(num2)
def sub(num1=0, num2=0):
    return int(num1) - int(num2)
def main():
    #Assuming our inputs are valid numbers
    print sys.argv
    pdb.set_trace() # <-- Break point added here
    addition = add(sys.argv[1], sys.argv[2])
    print addition
    subtraction = sub(sys.argv[1], sys.argv[2])
    print subtraction
if __name__ == '__main__':
    main()

# /Users/someuser/debugger.py(15)main()
-> addition = add(sys.argv[1], sys.argv[2])
(Pdb)

我們會(huì)看到下次被執(zhí)行的將是第15行。
程序在執(zhí)行第15行前暫停了。
我們?cè)谶@里有一些選擇。。。讓我們?cè)诮酉聛?lái)的步驟中展示其中一部分。

4 下一行 -> n

在debugger提示符處 按"n" 會(huì)到下一行。

> /Users/someuser/debugger.py(14)main()
-> addition = add(sys.argv[1], sys.argv[2])
(Pdb) n
> /Users/someuser/debugger.py(15)main()
-> print addition

 這會(huì)執(zhí)行當(dāng)前行并準(zhǔn)備好執(zhí)行下一行。
我們雖然能夠通過(guò)使用"n" 來(lái)一行行執(zhí)行程序,但這樣不是太有用。
你可能已經(jīng)注意到了pdb實(shí)際上并沒(méi)有進(jìn)入add函數(shù)中。讓我們?cè)诳纯磀ebugger的其他選項(xiàng),使排錯(cuò)變得更有趣。 

 注意:
 另一個(gè)酷酷的特性是按回車(chē)鍵會(huì)執(zhí)行你之前執(zhí)行過(guò)的命令(本例中為"n")。

5 打印 ->p

讓我們?cè)俅伍_(kāi)始debug吧?。热晃覀儧](méi)有任何程序會(huì)執(zhí)行完。你可以敲擊"c"使pdb跳至最后或者下一個(gè)斷點(diǎn)(break point) 

['debugger.py', '1', '2']
> /Users/someuser/debugger.py(14)main()
-> addition = add(sys.argv[1], sys.argv[2])
(Pdb)

現(xiàn)在如果我們想知道sys.argv包含了哪些參數(shù),我們可以這么干:

-> addition = add(sys.argv[1], sys.argv[2])
(Pdb) p sys.argv
['debugger.py', '1', '2']
(Pdb) p sys.argv[1]
'1'
(Pdb)

 這在檢測(cè)變量實(shí)際存儲(chǔ)的值時(shí)非常有用。
現(xiàn)在讓我們進(jìn)入add函數(shù)內(nèi)部

6 進(jìn)入函數(shù) -> s

我們可以通過(guò)使用"s"來(lái)進(jìn)入我們的addition函數(shù)。

(Pdb) s
--Call--
> /Users/someuser/debugger.py(4)add()
-> def add(num1=0, num2=0):
(Pdb) n
> /Users/someuser/debugger.py(5)add()
-> return int(num1) + int(num2)
(Pdb)

 這使我們來(lái)到了add函數(shù)的內(nèi)部,現(xiàn)在我們能夠在其中使用"n, p"以及其他操作了。
這時(shí)敲擊"r"會(huì)跳轉(zhuǎn)至所進(jìn)入函數(shù)的返回語(yǔ)句處。(譯注:再次敲擊時(shí)會(huì)跳轉(zhuǎn)至函數(shù)調(diào)用處)
這在你想快速跳轉(zhuǎn)至方法結(jié)尾時(shí)很有用。

7 動(dòng)態(tài)添加斷點(diǎn)(break point) -> b

我們?cè)谶\(yùn)行程序前通過(guò)pdb.set_trace()設(shè)置了斷點(diǎn)(break point)
通常在debugger開(kāi)始后,我們會(huì)想在一些特定的位置設(shè)置斷點(diǎn)(break point)
好基友 "b" 登場(chǎng)。
讓我們?cè)俅螆?zhí)行我們的程序

['debugger.py', '1', '2']
> /Users/someuser/debugger.py(15)main()
-> addition = add(sys.argv[1], sys.argv[2])
(Pdb)

現(xiàn)在我在第18行設(shè)置一個(gè)斷點(diǎn)(break point)。

-> addition = add(sys.argv[1], sys.argv[2])
(Pdb) b 18
Breakpoint 1 at /Users/someuser/debugger.py:18
(Pdb) c
We are in add--
3
> /Users/someuser/debugger.py(18)main()
-> print subtraction
(Pdb) p subtraction
-1
(Pdb)

如我們所見(jiàn),pdb直接跳至第18行并等待進(jìn)一步指令。
pdb也會(huì)給斷點(diǎn)賦一個(gè)數(shù)字(本例中為數(shù)字1)。我們能夠使用(原文為"user" 疑似筆誤)
enable/disable 斷點(diǎn)(break point)數(shù)字再進(jìn)一步執(zhí)行中啟用或關(guān)閉相對(duì)應(yīng)的斷點(diǎn)(break point)。

8 列表 -> l

有時(shí)在debug的過(guò)程中,你會(huì)迷失于代碼中。此時(shí),你可以使用"l"來(lái)輸出一個(gè)格式良好的摘要來(lái)告知你你身在何處。# 斟酌

['debugger.py', '1', '2']
> /Users/someuser/debugger.py(15)main()
-> addition = add(sys.argv[1], sys.argv[2])
(Pdb) l
 10
 11     def main():
 12         #Assuming our inputs are valid numbers
 13         print sys.argv
 14         pdb.set_trace() # <-- Break point added here
 15  ->     addition = add(sys.argv[1], sys.argv[2])
 16         print addition
 17         subtraction = sub(sys.argv[1], sys.argv[2])
 18         print subtraction
 

9 給變量動(dòng)態(tài)賦值

在debug時(shí),能給變量賦值也有助于排錯(cuò)。
假設(shè):

['debugger.py', '1', '2']
> /Users/someuser/debugger.py(15)main()
-> addition = add(sys.argv[1], sys.argv[2])
(Pdb) n
We are in add--
> /Users/someuser/debugger.py(16)main()
-> print addition
(Pdb) p addition
3 #<--- addition here is 3
(Pdb) addition = 'this is now string' #<--- We changed the value of additon
(Pdb) n
this is now string #<--- Now when we print it we actually gets it as a string. that we just set above.
> /Users/someuser/debugger.py(17)main()
-> subtraction = sub(sys.argv[1], sys.argv[2])

注意:
如果你想給像"n"這樣的變量賦值(即同時(shí)也是pdb 命令),你需要這樣做:

(Pdb) !n=5
(Pdb) p n
5

10 退出 -> q

最后你可以通過(guò)"q",在任何時(shí)刻退出。程序執(zhí)行會(huì)被終止。

11 擴(kuò)展閱讀

本文僅僅觸及pdb的表面。還有更多的文檔在向你招手!
那些使用iPython的能夠在ipdb中找到更好的debugger:tab補(bǔ)全,語(yǔ)法高亮以及其他酷酷的特性。
如果你有其他使用pdb的有趣方法請(qǐng)?jiān)谙旅嬖u(píng)論
排錯(cuò)愉快!

相關(guān)新聞

歷經(jīng)多年發(fā)展,已成為國(guó)內(nèi)好評(píng)如潮的Linux云計(jì)算運(yùn)維、SRE、Devops、網(wǎng)絡(luò)安全、云原生、Go、Python開(kāi)發(fā)專(zhuān)業(yè)人才培訓(xùn)機(jī)構(gòu)!