感谢关注天善智能,走好数据之路↑↑↑
欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式搞定!
对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴趣的同学加微信:tsaiedu,并注明消息来源(例如知乎),邀请你进入数据爱好者交流群,数据爱好者们都在这儿。
在编写代码时,每个人都会犯错误。有时很难调试它们。使用调试器可能有所帮助,但也可能令人生畏。本文是在IPython中使用pdb的TLDR教程,重点关注函数内部的变量。
全局变量的好处是,当一个脚本停止使用一个错误时,你可以查看变量来发现原因。使用函数时,你就没有这样的好运了。当然,任何重要的软件都会使用到函数。
于是我们就要用到调试器(debugger)了。Python自带一个叫作pdb的调试器,我们将介绍如何用IPython运行它。
首先,你需要启动它:
In [1]: pdbAutomatic pdb calling has been turned ON
而且,你可以选择只有在出现错误之后才进入调试模式的选项。在这种情况下,你只需事后键入debug。
pdb和debug都是IPython的magic commands,所以它们的官方语法是%pdb和%debug。如果没有这些名称的全局变量,那么省略形式也会起作用。
下面我们来定义一个函数:
def add_two( x ):return x + 2
当错误出现时,你就会得到一个调试器提示:
In [3]: add_two('two')---------------------------------------------------------------------------TypeError Traceback (most recent call last) in ()----> 1 add_two('two') in add_two(x)1 def add_two( x ):----> 2 return x + 2TypeError: cannot concatenate 'str' and 'int' objects> (2)add_two()1 def add_two( x ):----> 2 return x + 2ipdb>
或者是,pdb自动宣告终止:
In [3]: add_two('two')---------------------------------------------------------------------------TypeError Traceback (most recent call last) in ()----> 1 add_two('two') in add_two(x)1 def add_two( x ):----> 2 return x + 2TypeError: cannot concatenate 'str' and 'int' objectsIn [4]: debug> (2)add_two()1 def add_two( x ):----> 2 return x + 2ipdb>
pdb接受许多指令,其中许多是单个字母。你可以用h列出它们。
对于我们来说,最重要的指令是p,用于“打印”:
ipdb> h pp expressionPrint the value of the expression.ipdb> p x'two'
框架
在使用外部库时,堆栈跟踪由许多框架组成。在这个堆栈的某个地方出现了错误时,大多数情况下,人们倾向于在自己的代码中寻找错误,但是调试器建立在最深层的函数中。我们需要向上移动堆栈,执行这一步骤的指令是u。 将它输入熟悉的代码片段中就可以检查变量了。
跟踪/断点
进入调试器不非得创造一个错误。在代码中某处设置一个跟踪或断点就足够了::
import pdb; pdb.set_trace()
当执行到达此点时,程序将停止,您将得到一个调试器提示符。要继续执行exectution,使用c指令。
你还可以使用b命令在调试器中添加断点。
退出
用q键退出调试器。你还可以使用Ctrl-D
当你完成调试且不希望调试器提示错误时,你可以关闭它:
In [5]: pdbAutomatic pdb calling has been turned OFF
作者:Zygmunt Z
来源:FastML
参与:Cynthia
翻译:本文为天善智能编译,未经容许,禁止转载