繁体   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