我是python的新手,不确定断点方法的工作方式。它会为IDE或某些内置调试器打开调试器吗?
此外,我想知道调试器将如何运行。
例如,我使用Spyder,是否意味着如果使用breakpoint()方法,Spyder的调试器将打开,通过它可以打开Debugger下拉菜单,或者打开其他调试器?
我还想知道此函数与breakpointhook()方法一起工作的方式。
答案 0 :(得分:3)
否,由于设置了断点,调试器不会自动打开自身。
因此,您首先设置了一个断点(或更多),然后手动启动调试器。
此后,调试器将照常执行您的代码,但是*到达断点时*停止执行指令-断点本身将不执行的指令 。它会在之前暂停,让您有机会执行一些调试任务,例如
这是所有编程语言(及其IDE)的所有调试器的常见情况。
对于IDE,启动调试器将
在没有设置至少一个断点的情况下,大多数调试器会不停地执行整个程序(就像在没有调试器的情况下启动它一样),因此您将没有机会执行任何调试任务。
((某些IDE可以选择以“第一条指令,然后是暂停” 模式启动调试器,因此在这种情况下,您无需预先设置断点 )
是的,breakpoint()
内置函数(在Python 3.7中引入)停止执行程序,以调试模式进入程序,您可以使用Spyder的调试器下拉菜单。
(它不是 Spyders的调试器,只有其下拉菜单;使用的调试器仍为pdb
,即默认 P ython D e B ugger。)
breakpoint()
内置函数和breakpointhook()
函数之间的连接(来自sys
内置模块)非常简单-第一个直接调用第二个。
自然的问题是为什么我们需要两个行为完全相同的函数?
答案在设计中-通过更改breakpoint()
函数的行为,可以{em>间接更改breakpointhook()
函数。 / p>
例如,IDE创建者可以更改breakpointhook()
函数的行为,以使其启动自己的调试器,而不是pdb
调试器。
答案 1 :(得分:2)
内置breakpoint()
的默认行为是在此时打开pdb调试器。
即默认情况下为行
breakpoint()
行为应与
相同import pdb; pdb.set_trace()
可以通过修改sys.breakpointhook
来自定义行为(例如,打开其他调试器)。通常,只有在实现调试器或功能类似于调试器的情况下,才会执行此操作。如果从IDE运行代码,则IDE本身应修改sys.breakpointhook
,以便打开IDE调试器。 (我不知道是否所有的Python IDE都会这样做,但是他们应该这样做。)
有关更多信息(包括为何添加此功能的原理),请参见PEP 553 proposal。实际的实现已落入Python 3.7中。