在pycharm中,我想在调试过程中在一个什么都不做的断点处中断。我该怎么做呢?
例如,我想在pass
语句上中断:
for i in range(999999):
if i == 6232:
pass
如果我在pass
上设置了断点,调试器不会在那里中断。到目前为止,我所能做的最接近的事情是构造一个未使用的变量名,并给它赋一个无意义的值,这样我就可以在该行上设置断点:
for i in range(999999):
if i == 6232:
foobar_unused_variable = "At least I can set a breakpoint on this line."
4条答案
按热度按时间1cosmwyk1#
这个问题超越了PyCharm,它是一个Python的问题,当编译器把AST编译成字节码时,它甚至不编译
Pass
节点;pass
关键字的预期用途是防止编译器抱怨否则会是空的因此,由于调试器对字节代码进行操作,它永远不会知道省略的pass
语句,因此,尽管包含pass
语句的行在某种程度上从技术上讲是有效的断点位置,它将永远不会触发。有几种选择:
pass
替换为对内置breakpoint
函数的调用。pass
替换为一个没有效果的语句(例如0
或print(end='')
)并在其上中断。确保在使用完它们后将其删除。然而,在某些Python实现中,这些语句可能会被优化掉,也可能不会被优化掉。6kkfgxo02#
使用省略号!
对于快速断点或对代码产生最小视觉影响的内容,可以在
...
(省略号)上插入并中断:例如:
这可能是对我最干净的方式。
一些背景
Ellipsis是一个特殊的内置python对象,主要用于Slice标注。这里我(ab)使用它来做其他事情。请参见:What does the Python Ellipsis object do?
可以在代码中插入一个空整数、变量名或其他东西来在某个位置设置断点,但这可能看起来很奇怪,会让代码混乱,但
...
在视觉上是无害的。或以下内容:
测试了一些其他技巧:
发生在我身上的另一件有趣的事情是,当我在
pass
上设置断点时,它可能会中断,也可能不会中断,这取决于它在代码中的位置,但中断或不中断的确切规则不知何故并不清楚。w1jd8yoj3#
正如其他人所说的,没有干净的方法来实现这一点。
然后在该行上设置断点。
优点:
1.它允许你在那里设置一个断点。(你想做什么。)
1.一旦你习惯了这个成语,你就知道它的真正含义了。
1.您可以不时地检查您的代码并删除不再使用的旧代码。
缺点:
1.如果不定期删除它们,代码就会变得混乱。
1.协作者可能会对您正在做的事情感到困惑。
1.如果你把它们留在生产代码中,可能会有轻微的性能影响(取决于Python是否对它们进行了优化)。
xxe27gdn4#
断点函数
breakpoint()
适用于:虚拟打印语句
但是当我想打开和关闭它时,我使用了一个print函数,而不是通过
()
调用它;就像这样:虚拟变量赋值
这比分配一个哑变量要好,因为它不会使我的命名空间变得混乱(这使得调试更容易),而且PyCharm不会警告我未使用的变量。
椭圆
省略号解决方案对我的PyCharm不起作用。