鍍金池/ 教程/ Python/ 調(diào)試(Debugging)
<code>open</code>函數(shù)
Python 2系列版本
可迭代對(duì)象(Iterable)
異常
在函數(shù)中嵌入裝飾器
你的第一個(gè)裝飾器
上下文管理器(Context managers)
<code>set</code>(集合)數(shù)據(jù)結(jié)構(gòu)
裝飾器類
字典推導(dǎo)式(<code>dict</code> comprehensions)
<code>Reduce</code>
捐贈(zèng)名單
<code>Filter</code>
<code>try/else</code>從句
*args 的用法
<code>dir</code>
處理異常
<code>else</code>從句
對(duì)象自省
For - Else
18. 一行式
Python 3.2及以后版本
Global和Return
基于類的實(shí)現(xiàn)
容器(<code>Collections</code>)
23. 協(xié)程
推薦閱讀
譯者后記
<code>*args</code> 和 <code>**kwargs</code>
**kwargs 的用法
生成器(Generators)
迭代(Iteration)
基于生成器的實(shí)現(xiàn)
將函數(shù)作為參數(shù)傳給另一個(gè)函數(shù)
日志(Logging)
三元運(yùn)算符
<code>inspect</code>模塊
枚舉
Map,F(xiàn)ilter 和 Reduce
各種推導(dǎo)式(comprehensions)
從函數(shù)中返回函數(shù)
列表推導(dǎo)式(<code>list</code> comprehensions)
處理多個(gè)異常
帶參數(shù)的裝飾器
對(duì)象變動(dòng)(Mutation)
22. 目標(biāo)Python2+3
迭代器(Iterator)
虛擬環(huán)境(virtualenv)
<code>__slots__</code>魔法
什么時(shí)候使用它們?
Python/C API
<code>Map</code>
SWIG
授權(quán)(Authorization)
裝飾器
一切皆對(duì)象
使用C擴(kuò)展
使用 <code>*args</code> 和 <code>**kwargs</code> 來(lái)調(diào)用函數(shù)
17. <code>lambda</code>表達(dá)式
集合推導(dǎo)式(<code>set</code> comprehensions)
<code>type</code>和<code>id</code>
在函數(shù)中定義函數(shù)
<code>finally</code>從句
CTypes
調(diào)試(Debugging)
使用場(chǎng)景
生成器(Generators)
多個(gè)return值
關(guān)于原作者
函數(shù)緩存 (Function caching)
Python進(jìn)階

調(diào)試(Debugging)

利用好調(diào)試,能大大提高你捕捉代碼Bug的。大部分新人忽略了Python debugger(pdb)的重要性。 在這個(gè)章節(jié)我只會(huì)告訴你一些重要的命令,你可以從官方文檔中學(xué)習(xí)到更多。

譯者注,參考:https://docs.python.org/2/library/pdb.html Or https://docs.python.org/3/library/pdb.html

從命令行運(yùn)行

你可以在命令行使用Python debugger運(yùn)行一個(gè)腳本, 舉個(gè)例子:

$ python -m pdb my_script.py

這會(huì)觸發(fā)debugger在腳本第一行指令處停止執(zhí)行。這在腳本很短時(shí)會(huì)很有幫助。你可以通過(guò)(Pdb)模式接著查看變量信息,并且逐行調(diào)試。

從腳本內(nèi)部運(yùn)行

同時(shí),你也可以在腳本內(nèi)部設(shè)置斷點(diǎn),這樣就可以在某些特定點(diǎn)查看變量信息和各種執(zhí)行時(shí)信息了。這里將使用pdb.set_trace()方法來(lái)實(shí)現(xiàn)。舉個(gè)例子:

import pdb

def make_bread():
    pdb.set_trace()
    return "I don't have time"

print(make_bread())

試下保存上面的腳本后運(yùn)行之。你會(huì)在運(yùn)行時(shí)馬上進(jìn)入debugger模式?,F(xiàn)在是時(shí)候了解下debugger模式下的一些命令了。

命令列表:
  • c: 繼續(xù)執(zhí)行
  • w: 顯示當(dāng)前正在執(zhí)行的代碼行的上下文信息
  • a: 打印當(dāng)前函數(shù)的參數(shù)列表
  • s: 執(zhí)行當(dāng)前代碼行,并停在第一個(gè)能停的地方(相當(dāng)于單步進(jìn)入)
  • n: 繼續(xù)執(zhí)行到當(dāng)前函數(shù)的下一行,或者當(dāng)前行直接返回(單步跳過(guò))

單步跳過(guò)(next)和單步進(jìn)入(step)的區(qū)別在于, 單步進(jìn)入會(huì)進(jìn)入當(dāng)前行調(diào)用的函數(shù)內(nèi)部并停在里面, 而單步跳過(guò)會(huì)(幾乎)全速執(zhí)行完當(dāng)前行調(diào)用的函數(shù),并停在當(dāng)前函數(shù)的下一行。

pdb真的是一個(gè)很方便的功能,上面僅列舉少量用法,更多的命令強(qiáng)烈推薦你去看官方文檔。