前言:

最近新手小白 終於開始用Python 來寫一些量化分析的程式了(下次就跟大家分享)
但沒想到才剛起步就翻車
其實寫程式本來就是在bug中不停地修改
例如 資料格式阿~套件的函數阿~邏輯的順序阿~甚至是變數忘了給
都有可能發生

新手小白之前是有接觸R 所以大概知道怎麼去 debug 
但Python就不知道要怎麼用了~~ 
請教了google大神和新手小白的朋友之後
才知道 有一個 pdb 的包 可以簡單的去debug

它功能很多 如果想詳細研讀的話可以參考 官網的文件
https://docs.python.org/3.5/library/pdb.html#pdbcommand-next

這邊新手小白就用簡單的example 來講講這個 pdb 要怎麼簡單的來使用


正文:

首先 我先定義一個有問題的 fun 給大家看
這是一個在檢查 數列是不是偶數的 fun

import numpy as np
import pandas as pd
import pdb  # 先 import 今天要介紹的套件
qq=[];

def fun1(x):
    for ind in np.arange(x):
       
            if qq[ind] % 2 ==0:
                qq.append(ind);      
    return qq

大家可以試著compile ,儘管裡面寫錯它都是會給過的~~
然而我們實際執行看看 例如 fun1(20)

這邊可以看出來 Python 其實是很友善的 
當有error 的時候 它會跟你說是哪一行發生錯誤(黃框的部分) 
並且錯誤的原因是什麼  如果只是小問題的話~
那其實參考它的提示 直接改就可以了
不過我們來試試  pdb 來解bug吧
 

簡單的用法是   先在發生 bug 的前一行
加入這個指令來設停止點 pdb.set_trace()

也就是
def fun1(x):
    for ind in np.arange(x):
            pdb.set_trace()
            if qq[ind] % 2 ==0:
                qq.append(ind);      
    return qq

然後再一次執行 我剛剛的fun1(20)
你會發現它多出了一個框框 而且可以讓你輸入東西
這就是pdb的特殊環境
 

以我的fun1 為例 我想知道這邊哪邊錯了 就可以試試把變數都教出來看看
直接打在 框框裡就好了 
例如 我想知道 qq是甚麼 :

它就顯示出 阿~qq是一個空的 list 
所以我搞錯囉~~  因為我是想知道 
我的fun1中的for loop  每次的  ind  這個變數是不是偶數~~
所以正確的程式應該把 
qq[ind] % 2 這句改成  ind % 2
這樣才是正確的 因此 我就debug 完了

那要怎麼離開 pdb的環境呢  很簡單 打 q 就好了

 

它會顯示一些操作紀錄的東西   不過新手小白沒有用到這些
那我改完的程式就長這樣囉   output也和我預期的相同

注意: 我離開 pdb 環境後再按run 有的時候output不會出來的? 有的時候又可以
         我知道的解決辦法是 按選單的 kernel => Restart & Clear Output => 再按run
 

今天就分享到這邊囉  感謝大家
如有不足 歡迎在下邊的留言板上 寫上您的建議


補充:

上面就是簡單的 debug 方法了
( 設停止點 => 看看變數是不是出了問題 => 找到問題並修正)


但其實pdb 環境 還有一些特別語法 新手小白覺得挺酷的  大家可以試試

例如

q => 離開 pdb 環境的時候, 剛有使用過  ( 一定會用到啦 除非你改完之後重開XD )
r  => 繼續執行, 直到下一個停止點 ( 再遇到迴圈的時候很常用 )
n => 執行下一行程式
s => 進入函式(新手小白有試過 它會進到fun 裡面的fun 只是不知道要怎麼回去...  )
p(變數名稱) => 印出變數 和 print 一樣,就是比較方便而已
l => 列出目前的程式片段,這我就沒試過囉

arrow
arrow
    文章標籤
    新手 小白 入門 python
    全站熱搜

    Markjong001 發表在 痞客邦 留言(0) 人氣()