久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

調(diào)試Python程序代碼的幾種方法總結(jié)

 千秋鶴 2017-07-02

程序能一次寫完并正常運(yùn)行的概率很小,基本不超過(guò)1%,??倳?huì)有各種各樣的bug需要修正。有的bug很簡(jiǎn)單,,看看錯(cuò)誤信息就知道,,有的bug很復(fù)雜,我們需要知道出錯(cuò)時(shí),,哪些變量的值是正確的,,哪些變量的值是錯(cuò)誤的,因此,,需要一整套調(diào)試程序的手段來(lái)修復(fù)bug,。

第一種方法簡(jiǎn)單直接粗暴有效,就是用print把可能有問(wèn)題的變量打印出來(lái)看看:

1
2
3
4
5
6
7
8
9
10
# err.py
def foo(s):
  n = int(s)
  print '>>> n = %d' % n
  return 10 / n
def main():
  foo('0')
main()

執(zhí)行后在輸出中查找打印的變量值:

1
2
3
4
5
$ python err.py
>>> n = 0
Traceback (most recent call last):
 ...
ZeroDivisionError: integer division or modulo by zero

用print最大的壞處是將來(lái)還得刪掉它,,想想程序里到處都是print,,運(yùn)行結(jié)果也會(huì)包含很多垃圾信息。所以,,我們又有第二種方法,。
斷言

凡是用print來(lái)輔助查看的地方,都可以用斷言(assert)來(lái)替代:

1
2
3
4
5
6
7
8
# err.py
def foo(s):
  n = int(s)
  assert n != 0, 'n is zero!'
  return 10 / n
def main():
  foo('0')

assert的意思是,,表達(dá)式n != 0應(yīng)該是True,,否則,后面的代碼就會(huì)出錯(cuò),。

如果斷言失敗,,assert語(yǔ)句本身就會(huì)拋出AssertionError:

1
2
3
4
$ python err.py
Traceback (most recent call last):
 ...
AssertionError: n is zero!

程序中如果到處充斥著assert,和print相比也好不到哪去,。不過(guò),,啟動(dòng)Python解釋器時(shí)可以用-O參數(shù)來(lái)關(guān)閉assert:

1
2
3
4
$ python -O err.py
Traceback (most recent call last):
 ...
ZeroDivisionError: integer division or modulo by zero

關(guān)閉后,你可以把所有的assert語(yǔ)句當(dāng)成pass來(lái)看,。
logging

把print替換為logging是第3種方式,,和assert比,,logging不會(huì)拋出錯(cuò)誤,而且可以輸出到文件:

1
2
3
4
5
6
7
# err.py
import logging
s = '0'
n = int(s)
logging.info('n = %d' % n)
print 10 / n

logging.info()就可以輸出一段文本,。運(yùn)行,,發(fā)現(xiàn)除了ZeroDivisionError,沒有任何信息,。怎么回事,?

別急,在import logging之后添加一行配置再試試:

1
2
import logging
logging.basicConfig(level=logging.INFO)

看到輸出了:

1
2
3
4
5
6
$ python err.py
INFO:root:n = 0
Traceback (most recent call last):
 File "err.py", line 8, in <module>
  print 10 / n
ZeroDivisionError: integer division or modulo by zero

這就是logging的好處,,它允許你指定記錄信息的級(jí)別,,有debug,info,,warning,,error等幾個(gè)級(jí)別,當(dāng)我們指定level=INFO時(shí),,logging.debug就不起作用了,。同理,指定level=WARNING后,,debug和info就不起作用了,。這樣一來(lái),你可以放心地輸出不同級(jí)別的信息,,也不用刪除,,最后統(tǒng)一控制輸出哪個(gè)級(jí)別的信息。

logging的另一個(gè)好處是通過(guò)簡(jiǎn)單的配置,,一條語(yǔ)句可以同時(shí)輸出到不同的地方,,比如console和文件。
pdb

第4種方式是啟動(dòng)Python的調(diào)試器pdb,,讓程序以單步方式運(yùn)行,,可以隨時(shí)查看運(yùn)行狀態(tài)。我們先準(zhǔn)備好程序:

1
2
3
4
# err.py
s = '0'
n = int(s)
print 10 / n

然后啟動(dòng):

1
2
3
$ python -m pdb err.py
> /Users/michael/Github/sicp/err.py(2)<module>()
-> s = '0'

以參數(shù)-m pdb啟動(dòng)后,,pdb定位到下一步要執(zhí)行的代碼-> s = '0',。輸入命令l來(lái)查看代碼:

1
2
3
4
5
6
(Pdb) l
 1   # err.py
 2 -> s = '0'
 3   n = int(s)
 4   print 10 / n
[EOF]

輸入命令n可以單步執(zhí)行代碼:

1
2
3
4
5
6
(Pdb) n
> /Users/michael/Github/sicp/err.py(3)<module>()
-> n = int(s)
(Pdb) n
> /Users/michael/Github/sicp/err.py(4)<module>()
-> print 10 / n

任何時(shí)候都可以輸入命令p 變量名來(lái)查看變量:

1
2
3
4
(Pdb) p s
'0'
(Pdb) p n
0

輸入命令q結(jié)束調(diào)試,退出程序:

1
2
3
4
5
(Pdb) n
ZeroDivisionError: 'integer division or modulo by zero'
> /Users/michael/Github/sicp/err.py(4)<module>()
-> print 10 / n
(Pdb) q

這種通過(guò)pdb在命令行調(diào)試的方法理論上是萬(wàn)能的,,但實(shí)在是太麻煩了,,如果有一千行代碼,要運(yùn)行到第999行得敲多少命令啊,。還好,,我們還有另一種調(diào)試方法。
pdb.set_trace()

這個(gè)方法也是用pdb,,但是不需要單步執(zhí)行,,我們只需要import pdb,,然后,在可能出錯(cuò)的地方放一個(gè)pdb.set_trace(),,就可以設(shè)置一個(gè)斷點(diǎn):

1
2
3
4
5
6
7
# err.py
import pdb
s = '0'
n = int(s)
pdb.set_trace() # 運(yùn)行到這里會(huì)自動(dòng)暫停
print 10 / n

運(yùn)行代碼,,程序會(huì)自動(dòng)在pdb.set_trace()暫停并進(jìn)入pdb調(diào)試環(huán)境,可以用命令p查看變量,,或者用命令c繼續(xù)運(yùn)行:

1
2
3
4
5
6
7
8
9
10
$ python err.py
> /Users/michael/Github/sicp/err.py(7)<module>()
-> print 10 / n
(Pdb) p n
0
(Pdb) c
Traceback (most recent call last):
 File "err.py", line 7, in <module>
  print 10 / n
ZeroDivisionError: integer division or modulo by zero

這個(gè)方式比直接啟動(dòng)pdb單步調(diào)試效率要高很多,,但也高不到哪去。
IDE

如果要比較爽地設(shè)置斷點(diǎn),、單步執(zhí)行,,就需要一個(gè)支持調(diào)試功能的IDE。目前比較好的Python IDE有PyCharm:

http://www./pycharm/

另外,,Eclipse加上pydev插件也可以調(diào)試Python程序,。
小結(jié)

寫程序最痛苦的事情莫過(guò)于調(diào)試,,程序往往會(huì)以你意想不到的流程來(lái)運(yùn)行,,你期待執(zhí)行的語(yǔ)句其實(shí)根本沒有執(zhí)行,這時(shí)候,,就需要調(diào)試了,。

雖然用IDE調(diào)試起來(lái)比較方便,但是最后你會(huì)發(fā)現(xiàn),,logging才是終極武器,。

如對(duì)本文有疑問(wèn),請(qǐng)?zhí)峤坏浇涣魃鐓^(qū),,廣大熱心網(wǎng)友會(huì)為你解答?。? 點(diǎn)擊進(jìn)入社區(qū)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多