亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
12下一頁(yè)
最近訪問板塊 發(fā)新帖
查看: 32467 | 回復(fù): 12
打印 上一主題 下一主題

Python調(diào)試技巧介紹 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2008-08-30 01:42 |只看該作者 |倒序?yàn)g覽
Python調(diào)試技巧

鑒于這個(gè)問題已經(jīng)被問過多次了,我覺得應(yīng)該寫一個(gè)文檔介紹一下Python的調(diào)試。

1. print
不要看不起print,這是一切調(diào)試的起點(diǎn),即便是調(diào)試Java或者C這種巨麻煩的編譯語言,print仍然是常用工具。當(dāng)然,我們講的是Python,是比Java和C要方便100倍的動(dòng)態(tài)解釋語言,因此這個(gè)print就更有力了。至于語法如何,不用我講了吧。

2. reload
python本身就是一個(gè)交互式環(huán)境,你完全可以一邊寫代碼,一邊開一個(gè)python進(jìn)程,然后用reload調(diào)用你寫的模塊,順手傳幾個(gè)參數(shù)進(jìn)去,看看運(yùn)行的結(jié)果。

  1. # file name fac.py
  2. def factorial(n):
  3.         result = 1
  4.         for i in range(1, n+1):
  5.                 result *= i
  6.         return result
復(fù)制代碼


  1. >>> fac.factorial(5)
  2. 120
復(fù)制代碼


然后你用遞歸重寫了factorial(注意,我這里把*替換成了+)

  1. # file name fac.py
  2. def factorial(n):
  3.         if n == 1:
  4.                 return result
  5.         else:
  6.                 return n + factorial(n-1)
復(fù)制代碼


  1. >>> reload(fac)
  2. <module 'fac' from 'fac.py'>
  3. >>> fac.factorial(5)
  4. 15
復(fù)制代碼


3. reload有一點(diǎn)限制,就是這個(gè)模塊得能import得到。如果程序恰好不在PYTHONPATH里面,這一招就玩不轉(zhuǎn)了。不過人不能讓尿憋死對(duì)不對(duì)?所以python提供了exec和eval。

嚴(yán)格地說exec和eval并不是為了調(diào)試設(shè)計(jì)的,甚至我都不知道它們“應(yīng)該”用在哪里。通常Perl程序員都喜歡,或者不得不用exec,eval實(shí)現(xiàn)一些很暴力,很變態(tài)的功能。不過由于Python的良好設(shè)計(jì),這種濫用暴力的場(chǎng)合并不常見,因此Python初學(xué)者都對(duì)exec和eval不甚了解。這里正好借這個(gè)機(jī)會(huì)介紹一下者兩個(gè)工具。

exec的語法是
exec(code, environment)

這個(gè)code可以是一個(gè)字符串,也可以是一個(gè)文件對(duì)象。下面我們用文件對(duì)象舉例。

  1. >>> d = {}
  2. >>> exec(file('/tmp/fac.py', d)
  3. >>> d.get('factorial')(5)
  4. 15
復(fù)制代碼


eval和exec的意思相近,不過其功能是計(jì)算而不是賦值。(接上面的例子)
  1. >>> eval('factorial(12)', d)
  2. 15
復(fù)制代碼


這里environment是一個(gè)dictonary,因此當(dāng)python執(zhí)行完code之后,他會(huì)把所有的東西都放在這個(gè)environment里面。如果你不指定environment,python會(huì)在當(dāng)前的environment里執(zhí)行這段代碼。如果你剛運(yùn)行了一個(gè)factorial,接著又執(zhí)行了這個(gè)fac.py,那么這段代碼里的factorial就會(huì)取代你剛運(yùn)行的factorial。因此,強(qiáng)烈建議你,總是指定一個(gè)environment


4. python -i
exec也好,reload也罷,對(duì)于調(diào)試單獨(dú)一個(gè)類或者方法,是很方便的,但是如果在寫要用到這些類或者方法的程序時(shí),該怎么調(diào)試呢?寫一個(gè)wrapper方法。好主意,實(shí)際上我自己就經(jīng)常這么做。不過python的命令行參數(shù)提供了一個(gè)更棒的方法, -i

  1. # test.py
  2. def factorial(n):
  3.     if n == 1:
  4.         return 1
  5.     else:
  6.         return n * factorial(n-1)

  7. def sum(n):
  8.     if n == 1:
  9.         return 1
  10.     else:
  11.         return n + sum(n-1)

  12. result = 0
  13. for i in range(5, 7):
  14.     result += factorial(i) + sum(i)

  15.     if i == 6 :     # our debugging break point
  16.         break       #
復(fù)制代碼


  1. python -i test.py
  2. >>>
  3. >>> dir()
  4. ['__builtins__', '__doc__', '__file__', '__name__', 'factorial', 'i', 'result', 'sum']
  5. >>> result
  6. 876
復(fù)制代碼


5. logging
logging是一個(gè)遠(yuǎn)比print更強(qiáng)大的調(diào)試工具。Python的logging模塊非常強(qiáng)大,任何一個(gè)嚴(yán)肅的Py開發(fā)人員都應(yīng)該學(xué)會(huì)使用這個(gè)模塊。建議大家從Python的文檔入手,學(xué)習(xí)這個(gè)模塊。這里我就不多講了。

6. pdb, idle,komodo,windpdb,以及其他調(diào)試工具。
很遺憾,除了idle和komodo用過幾次,其他的都是只聞其名,實(shí)在是不知道該怎么介紹。不過我倒是一點(diǎn)也不覺得遺憾。就我個(gè)人的感覺,有了上面5個(gè)工具,完全夠用了。

[ 本帖最后由 shhgs 于 2008-9-2 12:20 編輯 ]

論壇徽章:
6
CU大牛徽章
日期:2013-04-17 10:59:39CU大;照
日期:2013-04-17 11:01:45CU大;照
日期:2013-04-17 11:02:15CU大;照
日期:2013-04-17 11:02:36CU大;照
日期:2013-04-17 11:02:582015年辭舊歲徽章
日期:2015-03-03 16:54:15
2 [報(bào)告]
發(fā)表于 2008-08-30 08:16 |只看該作者
習(xí)慣斷點(diǎn)了,

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2008-08-30 11:43 |只看該作者
多謝LZ的精彩講解,解除了我許多疑惑,哈哈~
PS:標(biāo)題拼錯(cuò)了……

[ 本帖最后由 jjj137 于 2008-8-30 12:14 編輯 ]

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2008-09-01 09:06 |只看該作者
感謝樓主分享。呵呵
不錯(cuò)不錯(cuò)

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2008-09-01 14:20 |只看該作者
學(xué)習(xí)一下,
我現(xiàn)在只會(huì)一個(gè)個(gè)的跟蹤程序變量,就是在命令行輸入變量的名字,看看哪個(gè)出現(xiàn)問題。

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2008-09-01 17:46 |只看該作者
這個(gè)對(duì)比較有用!

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2008-09-03 09:11 |只看該作者
很很大白菜的問一下,怎么實(shí)現(xiàn)單步跟蹤調(diào)試,雖然大家不推薦這么干,但是有這個(gè)還是很方便查錯(cuò)的?

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2008-09-03 09:20 |只看該作者
good.

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2008-09-03 13:58 |只看該作者
原帖由 Vinge 于 2008-9-3 09:11 發(fā)表
很很大白菜的問一下,怎么實(shí)現(xiàn)單步跟蹤調(diào)試,雖然大家不推薦這么干,但是有這個(gè)還是很方便查錯(cuò)的?

呵呵,單步調(diào)試就要借助工具了,見樓主的第六條。
另外貌似ulipad也帶了一個(gè)調(diào)試工具,沒用過不知怎么樣。

論壇徽章:
6
CU大牛徽章
日期:2013-04-17 10:59:39CU大;照
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大;照
日期:2013-04-17 11:02:36CU大;照
日期:2013-04-17 11:02:582015年辭舊歲徽章
日期:2015-03-03 16:54:15
10 [報(bào)告]
發(fā)表于 2008-09-03 19:27 |只看該作者
Assert 算嗎
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP