今天不讲关于人工智能的技术,今天讲解基础的,关于在数据科学实践中经常派上用场的软件工程。
编写代码时,每个人都会出错。有时很难调试它们。使用调试器可能会有所帮助,但也会令人生畏。这是有关在IPython中使用pdb的TLDR教程,重点是查看函数内部的变量。
拥有全局变量的优点是,当脚本因错误而停止时,你可以查看变量以查找原因。具有功能,没有这种运气。当然,任何不平凡的软件都需要功能。
这是调试器的来源。Python带有一个称为pdb的调试器。我们将研究如何在IPython中使用它。
首先,打开它:
In [1]: pdb Automatic pdb calling has been turned ON
方便的是,你可以选择仅在发生错误后进入调试模式。在这种情况下,您只需键入debugpost factum。感谢Ehud Ben-Reuven指出了这一点。
这两个PDB和调试是IPython的魔法命令,所以他们的官方语法%PDB和%调试。如果没有这些名称的全局变量,则较短的形式有效。
现在,让我们定义一个函数:
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 + 2 TypeError: cannot concatenate 'str' and 'int' objects > (2)add_two() 1 def add_two( x ): ----> 2 return x + 2 ipdb>
或者,通过自动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 + 2 TypeError: cannot concatenate 'str' and 'int' objects In [4]: debug > (2)add_two() 1 def add_two( x ): ----> 2 return x + 2 ipdb>
在此示例中,错误是显而易见的,并且在消息中已阐明,因此我们实际上不需要调试器。关键是要在实际使用中熟悉它。
pdb接受许多命令,其中许多是一个字母。您可以使用h列出它们。
就我们的目的而言,最重要的命令是p,用于“打印”:
ipdb> h p p expression Print the value of the expression. ipdb> p x 'two'
镜框
使用外部库时,堆栈跟踪由许多帧组成。在英语中,它表示一个称为函数的函数,该函数称为一个函数,依此类推,并且在此堆栈中的某处发生了错误。通常,最有趣的是在自己的代码中发现错误,但调试器将位于最深层的最深层函数中。我们需要向上移动堆栈,执行该命令的命令是u。你键入它,直到显示熟悉的代码段。现在您可以检查变量。
痕迹/断点
不需要错误即可停止程序执行并进入调试器。在代码中的某处设置跟踪或断点就足够了:
import pdb; pdb.set_trace()
当执行到此点时,程序将停止,并且您将收到调试器提示。要继续执行,请使用c命令。
您还可以使用b命令从调试器中添加断点。
q退出调试器。您也可以使用Ctrl-D退出。
完成调试并且不希望调试器提示错误时,请将其关闭:
In [5]: pdb Automatic pdb calling has been turned OFF
分享到这,如果觉得有用的话可以关注我。