成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python里三個高逼格的調試神器

開發(fā) 后端
調試是開發(fā)過程中不可避免的一個環(huán)節(jié),在Python中我們使用print、logging、assert等方法進行調試既簡單又實用,但畢竟有其局限性。

 調試是開發(fā)過程中不可避免的一個環(huán)節(jié),在Python中我們使用print、logging、assert等方法進行調試既簡單又實用,但畢竟有其局限性。今天這篇文章為大家?guī)砣齻€工具,其中有Python的內置模塊也有第三方庫,它們提供了調試代碼所需的大部分常用功能,將極大的提升我們的開發(fā)和bug排除效率。

[[278608]]

1.PDB

pdb是Python中的一個內置模塊,啟用pdb后可以對代碼進行斷點設置和跟蹤調試。為了演示方便,我們準備一個樣例程序pdb_test.py:

  1. def countnumber(number): 
  2.  for i in range(number): 
  3.  print(i) 
  4. if __name__ == '__main__'
  5.  countnumber(10) 

之后在終端中輸入python -m pdb pdb_test.py命令,進入pdb的調試模式:

這時我們就可以通過各種命令控制代碼執(zhí)行或者查看當前變量,例如l可以查看所有代碼,n是執(zhí)行下一步代碼,p可以查看當前變量等等,需要注意的是命令n只會執(zhí)行主程序中的代碼,如果想要單步執(zhí)行子函數(shù)中的代碼,需要使用s指令,調試效果如下:

可以看到,通過s指令(如果只想在主函數(shù)中單步執(zhí)行可以使用n)和p指令,我們控制程序單步運行并實時查看了相關變量。但是單步執(zhí)行畢竟是一種效率非常低下的調試方式,尤其當代碼量比較大的時候更是噩夢,這時就需要用到pdb的set_trace()方法,我們對樣例程序pdb_test.py做一點修改:

  1. import pdb 
  2. def countnumber(number): 
  3.  for i in range(number): 
  4.  print(i) 
  5.  pdb.set_trace() 
  6. if __name__ == '__main__'
  7.  countnumber(10) 

pdb.set_trace()的作用就是在代碼中設置斷點,在pdb調試模式下,使用c命令就會直接跳轉到下一個斷點位置,如果之后沒有其他斷點就會執(zhí)行完全部代碼,調試效果如下:

除了上面提到的幾個指令以外,pdb還有其他一些比較常用的命令(見下表),綜合使用基本能夠滿足日常的調試需求。

2.Better-exceptions

better-exceptions是一個Python第三方庫,作者對他的定義是“使異常信息更加美觀和詳盡”。在正式使用之前先說下這個庫的安裝:

  • 第一步,使用pip install better_exceptions安裝better-exceptions庫;
  • 第二步,使用export BETTER_EXCEPTIONS=1(Linux / OSX)或setx BETTER_EXCEPTIONS 1(Windows)設置環(huán)境變量。

現(xiàn)在就可以正常使用better-exceptions進行調試了,為了演示效果更加明顯,我們對上文中的代碼稍作修改作為本次的樣例程序better_test.py:

  1. def divisionnumber(number, div): 
  2.  for i in range(div): 
  3.  print(number / i) 
  4. if __name__ == '__main__'
  5.  divisionnumber(10, 10) 

很明顯,上面這段代碼在執(zhí)行過程中會因為分母為0而拋出異常,現(xiàn)在我們執(zhí)行python better_test.py,看看啟用了better-exceptions后的異常信息是什么樣子的:

從上面這幅圖可以看出better-exceptions對異常信息的修改主要體現(xiàn)在兩個方面:

  • 一是對產生異常的代碼進行了顏色標注;
  • 二是對產生異常的代碼中的相關變量值進行了輸出(包括函數(shù)等對象);

這樣一來,很多時候我們只需要根據(jù)better-exceptions輸出的輔助信息就能判斷產生異常的位置和原因,而不必像以前一樣再次查看源代碼并觀察運行結果,正如作者所說:Pretty and more helpful。

但是,過多的信息輸出也會有問題,那就是當代碼層級結構比較復雜的時候,better-exceptions輸出的輔助信息可能會非常之多,就比如上面的divisionnumber函數(shù),他所在的地址信息多數(shù)時候我們并不關心,為了屏蔽這些“垃圾”信息,我們可以在代碼中加一行:

  1. better_exceptions.MAX_LENGTH = XXX 

XXX是允許顯示的最大字符長度,比如這里設置為10,再來運行better_test.py這個程序就會是下面的結果:

可以看到,對函數(shù)divisionnumber的注釋只顯示了最開始的"

除了上面提到的功能之外,better-exceptions還可以和logging還有django無縫接入,這使得它的應用更加靈活,關于這方面內容大家可以查看項目文檔。

還有一點需要提醒大家,如果你是在windows下使用,可能會出現(xiàn)下圖中的亂碼問題,這是由于better-exceptions的內設編碼格式所導致的。

解決的辦法是在安裝后,對better_exceptions目錄下的encoding.py文件第10行代碼進行如下修改:

  1. # 原代碼: 
  2. ENCODING = locale.getpreferredencoding() 
  3. # 修改為: 
  4. ENCODING = 'utf-8' 

3.PySnooper

PySnooper也是一個Python的第三方庫,他的特點是能夠精準的顯示每條代碼的執(zhí)行順序、執(zhí)行時間以及隨之帶來的局部變量的改變等等。值得一提的是,作為一個發(fā)布不滿半年的庫,PySnooper在github上已經達到了1.2W星,其受歡迎程度可見一斑。

PySnooper的使用可以說是非常的方便,直接在代碼中以裝飾器的形式調用就可以了。當然在引用前你得使用pip install pysnooper或者conda install -c conda-forge pysnooper安裝這個庫。我們還是舉一個例子來進行演示,樣例代碼如下:

  1. import pysnooper 
  2. import random 
  3. @pysnooper.snoop() 
  4. def foo(): 
  5.  lst = [] 
  6.  for i in range(10): 
  7.  lst.append(random.randrange(1, 1000)) 
  8.  lower = min(lst) 
  9.  upper = max(lst) 
  10.  mid = (lower + upper) / 2 
  11.  print(lower, mid, upper
  12. foo() 

在上面這段代碼中,我們先是生成10個1到1000之間的隨機數(shù),然后計算他們之中的最大最小值和中位數(shù),唯一的不同在于第三行多了一條語句@pysnooper.snoop(),我們運行以下代碼,發(fā)現(xiàn)除了正常的print結果之外,多了許多內容(內容太多,下面只顯示一部分):

  1. 19:51:57.704857 call 16 def foo(): 
  2. 19:51:57.705860 line 17 lst = [] 
  3. New var:....... lst = [] 
  4. 19:51:57.705860 line 18 for i in range(10): 
  5. New var:....... i = 0 
  6. 19:51:57.705860 line 19 lst.append(random.randrange(1, 1000)) 
  7. Modified var:.. lst = [758] 
  8. 19:51:57.705860 line 18 for i in range(10): 
  9. Modified var:.. i = 1 
  10. .................... 
  11. 19:51:57.706818 line 22 upper = max(lst) 
  12. New var:....... upper = 927 
  13. 19:51:57.706818 line 23 mid = (lower + upper) / 2 
  14. New var:....... mid = 552.0 
  15. 19:51:57.706818 line 24 print(lower, mid, upper
  16. 19:51:57.706818 return 24 print(lower, mid, upper
  17. Return value:.. None 

這都是PySnooper跟蹤監(jiān)控的結果,正如上面所說,他準確記錄的每條代碼的運行時間、順序以及相關的變量值。

作為一個星標1.2W+的項目,PySnooper的功能肯定不會這么簡單,@pysnooper.snoop()中是可以接收參數(shù)的,比如我們覺得輸出內容太多,可以考慮把信息記錄到log日志中,這個功能只需要加一個log文件定位參數(shù)就能搞定:

  1. @pysnooper.snoop('file.log'

@pysnooper.snoop()支持的參數(shù)還有很多,分別對應了不同的功能,例如監(jiān)控自定義表達式、監(jiān)控底層函數(shù)、支持多線程等等,詳見項目文檔。

此外,pysnooper還支持局部監(jiān)控,一般來說我們寫的代碼都比較長,而需要監(jiān)控的只是其中的一小部分,這時候就可以把需要監(jiān)控的代碼放到一個block里。我們修改下剛才的代碼,只對計算最大最小值和中位數(shù)的部分進行監(jiān)控,修改后的代碼如下:

  1. import pysnooper 
  2. import random 
  3. def foo(): 
  4.  lst = [] 
  5.  for i in range(10): 
  6.  lst.append(random.randrange(1, 1000)) 
  7.  with pysnooper.snoop(): 
  8.  lower = min(lst) 
  9.  upper = max(lst) 
  10.  mid = (lower + upper) / 2 
  11.  print(lower, mid, upper
  12. foo() 

運行之后發(fā)現(xiàn)監(jiān)控信息精簡了很多:

  1. New var:....... lst = [562, 341, 552, 353, 628, 302, 430, 188, 955, 108] 
  2. New var:....... i = 9 
  3. 20:02:47.359272 line 21 lower = min(lst) 
  4. New var:....... lower = 108 
  5. 20:02:47.359272 line 22 upper = max(lst) 
  6. New var:....... upper = 955 
  7. 20:02:47.360269 line 23 mid = (lower + upper) / 2 

使用with pysnooper.snoop()模式依然保留了對各種參數(shù)的支持,個人認為這種模式更加符合實踐需求。

小結:

今天介紹了三個不借助IDE就能方便使用的調試工具,三個工具的調試思路和適用場景也各不相同,大家可以根據(jù)需要靈活選用。不過話說回來,我個人最喜歡的還是PySnooper,你最喜歡哪一款呢?

責任編輯:華軒 來源: 菜鳥學Python
相關推薦

2024-03-11 00:05:00

2025-02-14 00:25:00

SQL寫法業(yè)務

2020-06-08 15:18:50

Python圖片PIL

2016-11-17 12:49:36

云運維銀行卡建設

2015-01-15 10:57:35

App春節(jié)

2015-07-27 17:21:51

Google SRE運維

2010-03-26 15:41:39

Python腳本

2015-04-01 10:07:06

云計算概念公有云私有云

2021-10-13 06:59:03

Python技巧編程

2023-04-26 11:14:11

IT領導者遠程工作

2022-06-30 09:01:00

嵌入式軟件技巧

2020-09-29 14:13:29

寫一個高逼格可視化“圓

2020-06-11 09:00:27

SDN網(wǎng)絡架構網(wǎng)絡

2013-08-21 11:11:35

大數(shù)據(jù)

2021-12-09 14:54:58

大數(shù)據(jù)人工智能AI

2010-03-15 16:34:50

Python字典

2011-09-09 14:52:55

2018-05-14 14:50:15

2018-02-25 07:23:23

2010-09-02 16:46:52

SOAP協(xié)議
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人美女免费网站视频 | 精品国产视频 | 亚洲大片 | 亚洲激情综合 | 欧美日韩福利 | 亚洲视频免费在线看 | 国产精品99久久久久久动医院 | 99精品一区二区三区 | 亚洲日本中文字幕在线 | 欧美一区二区三区四区五区无卡码 | 超碰91在线| 国产男女猛烈无遮掩视频免费网站 | 国产日韩精品在线 | 看真人视频一级毛片 | 欧美一级做a爰片免费视频 国产美女特级嫩嫩嫩bbb片 | 一区二区三区视频在线观看 | 精品国产久 | 国产成人免费视频 | 日韩中文在线 | 国产精品国产精品国产专区不蜜 | 日本精品一区二区三区在线观看视频 | 欧美国产精品 | 久久久久久久电影 | 麻豆视频在线免费看 | 热久久性 | 免费看91 | 欧美1区 | 国产免费又色又爽又黄在线观看 | 婷婷在线视频 | 亚洲国产18| 91久久精品一区 | 欧美一区二区在线观看 | 精品国产精品一区二区夜夜嗨 | 性做久久久久久免费观看欧美 | 奇米久久 | 视频第一区 | 亚洲欧美一区二区三区1000 | 国产激情视频在线 | 欧美精品在线免费 | 91精品国产一区二区三区香蕉 | 91在线视频免费观看 |