您要问的部分内容(在执行过程中如何以及是否发生了变化)只能由回溯调试器回答。据我所知,确实存在一些,但总的来说,这更多是当前研究的一个领域,也是一个需要解决的非常复杂的问题。有一个有趣的Google Tech Talk 关于及时调试。但我不知道有一个现成的 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
会话 ( q
),删除你的断点并在有趣的代码行之前设置一个新的断点。
重复,直到你找到你想知道的。
如果您的任何函数碰巧被调用了数百次,但您只对特定情况感兴趣,请修改代码,以便仅在满足条件时触发断点。例如:
if 'interesting' in data.keys():
import pdb; pdb.set_trace()
遵循此模式将使您了解和调试您或其他人的代码。请记住:这只是 Python ;-)