如何在pycharm中通过`pass`

Edw*_*vey 5 python debugging pycharm

在pycharm中,我想在调试期间中断不执行任何操作的断点。我怎样才能做到这一点?

例如,我想谈一谈以下内容pass

for i in range(999999):
    if i == 6232:
        pass
Run Code Online (Sandbox Code Playgroud)

如果我在上设置了一个断点pass,则调试器不会在那里中断。到目前为止,我能做的最接近的事情是组成一些未使用的变量名,并为其分配一个无意义的值,因此我可以在该行上设置一个断点:

for i in range(999999):
    if i == 6232:
        foobar_unused_variable = "At least I can set a breakpoint on this line."
Run Code Online (Sandbox Code Playgroud)

Tyl*_*ton 8

当即时编译器编译您的示例时,它会编译为空pass。换句话说,pass只是一个关键字,应该用来告诉编译器在否则将是空块的内容中没有语法错误。例如,尝试在没有pass. 不会工作。您还可以尝试使用未使用的表达式(例如0)或无效果语句(例如print(end=''))代替pass。但我建议尽可能删除这些。您还可以设置条件断点而不是在if语句内中断。

更新:从 Python 3.7+ 开始,现在可以使用内置breakpoint()函数


imk*_*kzh 6

使用省略号!

对于快速断点或对您的代码产生最小视觉影响的东西,您可以在...(省略号)上插入和中断:

例如:

while some_condition():
    do_something()
    ...  #  <<< set break point here!
Run Code Online (Sandbox Code Playgroud)

这可能是对我最干净的方式。

一些背景

Ellipsis 是一个特殊的内置 Python 对象,主要用于 Slice 表示法。在这里,我(ab)用它来做其他事情。请参阅:Python Ellipsis 对象有什么作用?

可以在代码中插入一个裸整数、变量名或其他东西来在某个地方设置断点,但它可能看起来很奇怪并且会使你的代码混乱,但...在视觉上是无害的。与此比较:

break_point = 0
while some_condition():
    do_something()
    break_point # <<< set break point here!
Run Code Online (Sandbox Code Playgroud)

或这个:

while some_condition():
    do_something()
    if False: # <<< set break point here!
        pass
Run Code Online (Sandbox Code Playgroud)

其他一些技巧测试:

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)
Run Code Online (Sandbox Code Playgroud)

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

  • 不错的尝试,但是...当我简单地将 `...` 或 `3` 插入代码并在其上设置断点时......它不会中断。我猜一些编译优化器正在优化它......即使我输入 `if False:` 并尝试打破它,它也不会中断。更多证据表明编译器将其优化掉。¯\\_(ツ)_/¯ (2认同)