国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

調試Python程序代碼的幾種方法總結

2020-02-23 00:56:31
字體:
來源:轉載
供稿:網友

程序能一次寫完并正常運行的概率很小,基本不超過1%。總會有各種各樣的bug需要修正。有的bug很簡單,看看錯誤信息就知道,有的bug很復雜,我們需要知道出錯時,哪些變量的值是正確的,哪些變量的值是錯誤的,因此,需要一整套調試程序的手段來修復bug。

第一種方法簡單直接粗暴有效,就是用print把可能有問題的變量打印出來看看:

# err.pydef foo(s):  n = int(s)  print '>>> n = %d' % n  return 10 / ndef main():  foo('0')main()

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

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

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

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

# err.pydef foo(s):  n = int(s)  assert n != 0, 'n is zero!'  return 10 / ndef main():  foo('0')

assert的意思是,表達式n != 0應該是True,否則,后面的代碼就會出錯。

如果斷言失敗,assert語句本身就會拋出AssertionError:

$ python err.pyTraceback (most recent call last): ...AssertionError: n is zero!

程序中如果到處充斥著assert,和print相比也好不到哪去。不過,啟動Python解釋器時可以用-O參數來關閉assert:

$ python -O err.pyTraceback (most recent call last): ...ZeroDivisionError: integer division or modulo by zero

關閉后,你可以把所有的assert語句當成pass來看。
logging

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

# err.pyimport loggings = '0'n = int(s)logging.info('n = %d' % n)print 10 / n

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

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

import logginglogging.basicConfig(level=logging.INFO)

看到輸出了:

$ python err.pyINFO:root:n = 0Traceback (most recent call last): File "err.py", line 8, in <module>  print 10 / nZeroDivisionError: integer division or modulo by zero

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 江孜县| 萨嘎县| 奉节县| 大连市| 二手房| 锦州市| 杭锦后旗| 黑龙江省| 高淳县| 咸丰县| 孟州市| 阿坝| 江油市| 大连市| 确山县| 永平县| 文水县| 丰顺县| 阳新县| 揭东县| 安阳县| 凤庆县| 阿勒泰市| 赤峰市| 鲁甸县| 白银市| 阳曲县| 莫力| 陆河县| 新巴尔虎右旗| 大厂| 贵溪市| 册亨县| 建水县| 海伦市| 祁东县| 邢台市| 龙里县| 黔西| 手机| 奎屯市|