簡體   English   中英

當你調試它們並完成時,你如何避免在python開源應用程序中留下調試器print / pdb語句?

[英]How do you avoid leaving debugger print/pdb statements in python open source apps when you're debugging them and just finish?

有時在使用開源軟件開發時,您需要閱讀它的源代碼(特別是zope / plone)。 很多時候我需要編寫print語句,調試調用(import pdb)或注釋try / except子句,你可以命名它。

有時我在嘗試查找問題時打開了很多文件,有時我忘記刪除這些打印/調試更改。

所以,我的問題是:做這件事時你如何保持自己的組織? 您是否在修改后編寫“TODO”並稍后搜索它們,您是否在編輯器中保存所有內容,當您找到所需內容時,只需還原文件(此方法在您搜索時無用)一個非常大的問題,需要幾天,你需要關閉你的電腦,並在前幾天返回)? 或者你只是不做什么,因為開發環境中的print語句沒什么可擔心的?

我正在使用Vim。 我只是想知道其他程序員如何處理這個問題。

對於我自己的項目,源代碼始終處於版本控制中。 在提交之前,我總是檢查圖形差異,以便我可以看到改變了什么,提交消息應該是什么以及我是否可以分成更小的提交。 這樣,我幾乎總能識別臨時垃圾,如print語句。 如果沒有,我通常會在不久之后注意到它,並且如果我還沒有推動就可以做不成功(適用於像git和bzr這樣的DVCS,不適用於顛覆)。

關於需要多天的問題,這是一回事。 直到問題解決后我才會提交,然后再次查看差異。

允許在圖形差異視圖中進行編輯的文本編輯器在這些情況下非常有用,但我主要使用的是Eclipse,它不支持它。

我曾經經常遇到這個問題。 現在,作為我的簽入過程的一部分,我運行查找/ grep腳本組合,查找我的調試語句。 唯一需要注意的是,我必須保持我添加的調試語句一致,因此grep可以找到它們。

這樣的事情:

## pre-checkin_scan.bin
find . -name "*.py" -exec grep -H --file=/homes/js/bin/pre-checkin_scan_regexp_list.grep {} \;



## pre-checkin_scan_regexp_list.grep
## (The first pattern is to ignore Doxygen comments)

^##[^@]
pdb
^ *print *( *" *Dbg
^ *print *( *" *Debug
^ *debug

好的+1開始這個討論。 是的,有時這發生在我身上。 我離開了那些pdb並將代碼提交到中央代碼庫git。 我使用'emacs'。 因此,在提交代碼之前,我通常會在文件中搜索pdb。 但它是忙於檢查每個文件。所以,在提交代碼之前,我通常非常仔細地檢查差異。 我也找到了解決這個問題的更好方法。

我可以給你三點建議:

  1. 不要刪除調試器語句。 通過這個,我的意思是讓他們進入,但讓他們在調試模式下有條件:
# Set this to True to enable Debug code
XYZ_Debug = False

if XYZ_Debug:
    do_debugging()

哦,如果調試代碼只是為了打印出來,你應該熟悉日志記錄(PyMOTW) 如果您使用日志記錄,則可以:

import logging

# Set this to True to enable debug
XYZ_Debug = False

log = logging.getLogger("XYZ")
log.setLevel(logging.DEBUG if XYZ_Debug else logging.INFO)


log.debug("debug output")
  1. 在每行之后或每個塊附近放置相同的唯一標記(在注釋中):
do_debug_code() # XYZZY

然后我使用Emacs的Ibuffer功能,標記所有Python緩沖區,然后搜索此標記的出現。 在其他答案中使用find / grep / sed的某種組合也可以。

  1. 如果您正在使用Mercurial並且知道Mercurial Queues(或者可能想要了解它們),請將調試代碼保留為隊列中的補丁。 當你准備好“生產”時; 或推動當前的變化; 彈出包含調試代碼的補丁並轉到。 您可以使用diff和patch在版本控制之外實現類似的功能。

我還用Vim開發Python。 我從來沒有必要大幅修改源代碼進行調試。 我有時會調試打印語句,我習慣在每一個之后加上“#XXX”。 然后,當我想刪除它們(在提交之前),然后只搜索XXX並刪除這些行。

對於異常,我安排在Vim緩沖區中使用外部解釋器運行我的代碼,該外部解釋器設置為在任何未捕獲的異常上自動進入調試器。 然后我會在發生異常時自動放入代碼中。 我使用一個修改過的調試器,它也可以發信號通知Vim(實際上是GTK Gvim)在該行打開該源。

無論如何,捕獲的異常應報告有意義的錯誤。 許多人認為這是不好的做法,例如:

嘗試:...一些代碼除了:處理一切

因為您可能實際上並未處理所有可能的錯誤情況。 如果不這樣做,您還可以啟用自動調試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM