如何在pycharm中的'pass'上中断

a0zr77ik  于 2022-11-08  发布在  PyCharm
关注(0)|答案(4)|浏览(323)

在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."
1cosmwyk

1cosmwyk1#

这个问题超越了PyCharm,它是一个Python的问题,当编译器把AST编译成字节码时,它甚至不编译Pass节点; pass关键字的预期用途是防止编译器抱怨否则会是空的因此,由于调试器对字节代码进行操作,它永远不会知道省略的pass语句,因此,尽管包含pass语句的行在某种程度上从技术上讲是有效的断点位置,它将永远不会触发。
有几种选择:

  • pass替换为对内置breakpoint函数的调用。
  • pass替换为一个没有效果的语句(例如0print(end=''))并在其上中断。确保在使用完它们后将其删除。然而,在某些Python实现中,这些语句可能会被优化掉,也可能不会被优化掉。
  • 在条件检查上设置conditional breakpoint,而不是在主体内中断(假设中断条件没有任何有意义的副作用)。
6kkfgxo0

6kkfgxo02#

使用省略号!

对于快速断点或对代码产生最小视觉影响的内容,可以在...(省略号)上插入并中断:
例如:

while some_condition():
    do_something()
    ...  #  <<< set break point here!

这可能是对我最干净的方式。
一些背景
Ellipsis是一个特殊的内置python对象,主要用于Slice标注。这里我(ab)使用它来做其他事情。请参见:What does the Python Ellipsis object do?
可以在代码中插入一个空整数、变量名或其他东西来在某个位置设置断点,但这可能看起来很奇怪,会让代码混乱,但...在视觉上是无害的。

break_point = 0
while some_condition():
    do_something()
    break_point # <<< set break point here!

或以下内容:

while some_condition():
    do_something()
    if False: # <<< set break point here!
        pass

测试了一些其他技巧:

del []  # works(with warning: "cannot assign to []")
[]  # works(with warning: Statement seems to have no effect)
setbreakpoint = 1  # works(with warning: "local variable value is not used")
Ellipsis  # works(with warning: Statement seems to have no effect)

发生在我身上的另一件有趣的事情是,当我在pass上设置断点时,它可能会中断,也可能不会中断,这取决于它在代码中的位置,但中断或不中断的确切规则不知何故并不清楚。

w1jd8yoj

w1jd8yoj3#

正如其他人所说的,没有干净的方法来实现这一点。

dbg = True

然后在该行上设置断点。
优点:
1.它允许你在那里设置一个断点。(你想做什么。)
1.一旦你习惯了这个成语,你就知道它的真正含义了。
1.您可以不时地检查您的代码并删除不再使用的旧代码。
缺点:
1.如果不定期删除它们,代码就会变得混乱。
1.协作者可能会对您正在做的事情感到困惑。
1.如果你把它们留在生产代码中,可能会有轻微的性能影响(取决于Python是否对它们进行了优化)。

xxe27gdn

xxe27gdn4#

断点函数

breakpoint()适用于:

  • Python语言〉= 3.7
  • 内建程式码清除提醒。
  • 始终处于活动状态;它不能通过鼠标点击来切换关闭。

虚拟打印语句

但是当我想打开和关闭它时,我使用了一个print函数,而不是通过()调用它;就像这样:

for i in range(999999):
    print                 # Toggle breakpoint on this line

虚拟变量赋值

这比分配一个哑变量要好,因为它不会使我的命名空间变得混乱(这使得调试更容易),而且PyCharm不会警告我未使用的变量。

椭圆

省略号解决方案对我的PyCharm不起作用。

相关问题