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

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

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

为了真正迂腐,我想知道关于这个标签的所有可能信息,但真正重要的是:

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

4 回答 4

2

您要问的部分内容(在执行过程中如何以及是否发生了变化)只能由回溯调试器回答。据我所知,确实存在一些,但总的来说,这更多是当前研究的一个领域,也是一个需要解决的非常复杂的问题。有一个有趣的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 ;-)

于 2012-09-10T20:06:37.567 回答
1

要获取有关变量内容的信息,可以使用 dir(obj) 函数。

就像在这里:

class B(object):
    a = 0
    b = 1

b = B()
dir(b)

它会给你

['__class__',
 '__delattr__',
 '__dict__',
 '__doc__',
 '__format__',
 '__getattribute__',
 '__hash__',
'__init__',
 '__module__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 'a',
 'b']

位于标准库中的检查模块也有很多很棒的工具来收集有关对象的信息。

于 2012-09-10T19:04:02.787 回答
0

我认为你最好为你的代码编写单元测试(如果你还没有这样做的话),而不是传递真实的对象,而是使用例如Mock库传递模拟对象。然后,您可以检查是否对该对象进行了任何调用。

请注意,Python 中的变量名称只是一个标签,您最好了解 pass-by-reference / pass-by-value 等,因为这在调试应用程序时通常更有意义。

于 2012-09-10T18:40:48.820 回答
0

请参阅这篇文章以了解有关如何在代码中使用 pdb 的更多信息。Python 调试器是实现你真正想要的最好的工具之一。

http://greennotebook.com/2010/06/using-the-python-debugger-pdb/

于 2012-09-10T18:51:40.250 回答