def dummyFunction(context, data):
...
doing something
...
return something
我有一个运行得很好的脚本,但我想跟踪1-2个特定变量,例如假设我想追溯所有更改以及与data
相关的历史记录和语句, python能为我做什么?
python中有一个内置函数可以帮助我爆炸涉及特定变量的所有步骤?我能在python中发现只知道变量名称的内容吗?
要真正迂腐,我想知道关于这个标签的所有可能的信息,但真正重要的是:
答案 0 :(得分:2)
您所询问的部分内容(如何以及在执行期间是否发生了变化)只能通过回溯调试器来回答。据我所知,有些确实存在,但总的来说,这更像是当前研究的一个领域,也是一个需要解决的大问题。有一个有趣的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
会话(q
),删除断点并在有趣的代码行之前策略性地设置一个新断点。
重复,直到找到你想知道的东西。
如果您的任何函数碰巧被调用数百次,但您只对特定情况感兴趣,请修改代码,以便仅在满足条件时触发断点。例如:
if 'interesting' in data.keys():
import pdb; pdb.set_trace()
遵循此模式将采用 long 方式来理解和调试您或其他人的代码。请记住:它只是Python; - )
答案 1 :(得分: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']
位于标准库内的检查模块也有很多很棒的工具来收集有关对象的信息。
答案 2 :(得分:0)
如果您为代码编写单元测试(如果您还没有这样做),我认为您会更好,而不是传递真实对象,您可以使用例如Mock库传递模拟对象。然后,您可以检查是否已对该对象进行任何调用。
请注意,Python中的变量名称只是一个标签,您最好了解传递引用/按值传递等,因为这在调试应用程序时通常更有意义。
答案 3 :(得分:0)
请参阅此帖子以了解有关如何在代码中使用pdb的更多信息。 Python调试器是实现您真正想要的最好的之一。
http://greeennotebook.com/2010/06/using-the-python-debugger-pdb/