python - 什么 python 可以仅使用对象自己的标签来告诉我有关对象的信息?

标签 python debugging

def dummyFunction(context, data):
    ...
    doing something
    ...
    return something

我有一个运行良好的脚本,但我只想跟踪 1-2 个特定变量,例如假设我想跟踪所有更改、历史记录以及与数据相关的语句,python 能为我做什么?

Python中有一个内置函数可以帮助我分解涉及特定变量的所有步骤?仅知道变量名称,我能在 python 中发现什么?

说实话,我想知道有关该标签的所有可能信息,但真正重要的是:

  • 这个变量的内容是什么以及它在执行过程中如何以及是否发生了变化
  • 在哪里声明

最佳答案

您所询问的部分内容(在执行过程中如何更改以及是否发生更改)只能由回溯调试器来回答。据我所知,确实存在一些问题,但总的来说,这更多的是当前研究的一个领域,也是一个需要解决的极其复杂的问题。有一个有趣的Google Tech Talk about back in time debugging 。但我不知道是否有一个可以随时用于 Python。

好消息是,您很少需要它。

对于您的示例,我会像这样进行调试:

在该函数定义的第一行设置断点:

def dummyFunction(context, data):
    import pdb; pdb.set_trace()

第一次调用该函数时(以及所有后续调用),这会将您踢入 pdb。

通过输入 l 来验证这一点(小写 L),其中列出了您当前所在的代码行及其周围的一些上下文。

然后,输入 data检查 data 的内容。您可以像在常规交互式解释器中一样访问和检查对象。

现在,输入 w查看调用堆栈。您当前所在的调用 ( dummyFunction ) 位于底部,调用它的调用位于倒数第二行。

现在您想知道如何 data变成了现在的样子。因此,您可以在调用堆栈中上下移动,了解为什么使用该参数调用该函数。

类型 u在调用堆栈中向上移动一次。您现在将进入名为 dummyFunction(context, data) 的函数中。 ,您将能够检查该函数的本地范围内的变量。所以输入l再次显示代码,并研究调用前几行发生的情况。有什么条件吗?它们依赖于什么表达式?评估这些表达式并检查局部变量(尝试 locals() )以找出为什么使用该参数调用您的函数。检查调用函数获得的参数。

根据需要向上移动 ( u ) 或向下移动 ( d ) 堆栈。这根本不会移动指令指针,您只是剥开代表调用堆栈的洋葱层。

在某些时候,您会知道您关心的事情发生在某个特定的代码行,但您已经过去了(它已经被执行了)。一旦您确信这就是您想要遵循的线索,请退出当前的 pdb session ( q ),删除断点并设置一个新的断点,策略性地放置在有趣的代码行之前。

重复直到找到您想知道的内容。

如果您的任何函数碰巧被调用数百次,但您只对特定情况感兴趣,请修改代码,以便仅在满足条件时触发断点。例如:

if 'interesting' in data.keys():
    import pdb; pdb.set_trace()

遵循此模式将带您很长的方式来理解和调试您或其他人的代码。请记住:这只是 Python ;-)

关于python - 什么 python 可以仅使用对象自己的标签来告诉我有关对象的信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12357481/

相关文章:

python - 如何修复错误 "' id' : Select a valid choice"on Modelformset validation?

python - PyOpenGL-accelerate 到底是什么?

c - 如何在 GCC 中编译 C 程序以在 WinDbg 中启用调试?

node.js - Visual Studio 2013 Node 远程调试器和 mocha

python - 为什么我的 python 代码不打印任何东西?

python - 即使有元素, BeautifulSoup 也不会返回任何内容

python类工厂继承随机父级

linux - gdb:当 fglrx_dri.so 发生段错误时如何获得完整的回溯?

java - 学习 Java 调试

javascript - Chrome 调试器注入(inject) javascript