我遇到以下问题:
我的代码非常类似于以下
def my_function():
import pdb; pdb.set_trace()
....
在运行时,我的函数被调用了很多次。我对第一次调用此函数时检查代码执行感兴趣。
如果我已完成检查,我想点击c
,并且正常执行程序恢复,而不会在下次调用此函数时停在此断点处。
有办法做到这一点吗?或者我必须做一些完全不同的事情,例如将set_trace()
调用一些只调用一次的地方,然后一旦命中断点,使用tbreak my_function
之类的命令设置一个那里的时间突破点?
答案 0 :(得分:2)
您可以在第一次执行时尝试设置该功能的属性。类似的东西:
onRender: function () {
var year = $('.datepicker').pickadate('picker').get('highlight', 'yyyy');
var day = $('.datepicker').pickadate('picker').get('highlight', 'dd');
var month = $('.datepicker').pickadate('picker').get('highlight', 'mm');
console.log(year, day, month);
$('.picker__header').prepend('<div class="picker__date-display"><div class="picker__weekday-display">[current day label]</div><div class="picker__month-display"><div>[current month]</div></div><div class="picker__day-display"><div>'+day+'</div></div><div class="picker__year-display"><div>'+year+'</div></div></div>');
}
属性def my_function():
if not hasattr(my_function,'first_time'):
my_function.first_time = 1 # Dummy value
import pdb; pdb.set_trace()
...
将在函数调用之间持续存在,并且在第一次调用函数时,它将被创建。每次调用该函数时,它都将存在,并且不会执行if语句中的代码。这个解决方案依赖于你的函数不是类中的方法,因为类方法不能具有属性,因为它们已经是类的属性。
就像说明一样,我不确定你是否在实际代码中有导入,但最好的编码实践表明你应该只在代码的开头放入导入,而不是在你拥有的函数内部。
答案 1 :(得分:1)
遇到此问题时,我import pdb; pdb.set_trace()
在文件的开头(导入时间)或在__main__
(运行时),然后使用调试器list
(或仅使用{{ 1}})命令来查找您的行号,并使用l
(或仅break
)来设置断点。
您也可以从头开始以PDB模式启动程序,然后到达同一点。
b
例如,我将在第5行设置一个断点
(Pdb) help break
b(reak) ([file:]lineno | function) [, condition]
With a line number argument, set a break there in the current
file. With a function name, set a break at first executable line
of that function. Without argument, list all breaks. If a second
argument is present, it is a string specifying an expression
which must evaluate to true before the breakpoint is honored.
The line number may be prefixed with a filename and a colon,
to specify a breakpoint in another file (probably one that
hasn't been loaded yet). The file is searched for on sys.path;
the .py suffix may be omitted.
现在,继续
(Pdb) b 5
Breakpoint 1 at /home/flipmcf/program.py:5
到达断点后,您将输入Pdb。
由于您只想查看第一次运行,因此只需删除断点
(Pdb) c