PyCharm 未在 "pass" 上命中 Quick and Dirty 断点

PyCharm not hitting Quick and Dirty breakpoint on "pass"

我想添加一个快速但肮脏的断点,例如当我有兴趣在迭代一个长列表的中间停止时。

for item in list:
    if item == 'curry':
        pass

我在pass下了一个断点,它没有命中(!)。

如果我添加以下(空)打印

for item in list:
    if item = 'curry':
        pass
        print('')

和断点 passprint,只有 print 命中。

知道为什么吗? Windows7、(便携)Python3.7


[更新] 根据@Adam.Er8 的评论表,我尝试插入并设置省略号文字的断点,... 但没有被击中,尽管下面的 print('') 被击中了。


[Updtae++] 嗯,确实pass in

上打断点
for key, value in dictionary.items(): 
    pass

尝试用 ... 替换 pass:

for item in list:
    if item = 'curry':
        ...

你应该可以break-point那里

这被称为 ellipsis literal,与 pass 不同,它实际上是 "executed"(好吧,有点),这就是为什么你可以打破它,就像你会任何其他语句,但它有 0 个副作用并且读起来像 "nothing"(在发现这个技巧之前我会写 _ = 0

编辑:

你可以只设置一个条件断点。

在PyCharm中,这是通过right-clicking bp 和写入条件来完成的:

pass 实际上并没有进入字节码。代码完全一样,就好像它不存在一样。您可以使用 dis 模块看到这一点。 (在 linux 上使用 3.7 的示例)。

>>> import dis
>>> dis.dis(dis.dis('for i in a:\n\tprint("i")')                                                                                               
  1           0 SETUP_LOOP              20 (to 22)
              2 LOAD_NAME                0 (a)
              4 GET_ITER
        >>    6 FOR_ITER                12 (to 20)
              8 STORE_NAME               1 (i)

  2          10 LOAD_NAME                2 (print)
             12 LOAD_CONST               0 ('i')
             14 CALL_FUNCTION            1
             16 POP_TOP
             18 JUMP_ABSOLUTE            6
        >>   20 POP_BLOCK
        >>   22 LOAD_CONST               1 (None)
             24 RETURN_VALUE
>>> dis.dis('for i in a:\n\tpass\n\tprint("i")')                                                                                       
  1           0 SETUP_LOOP              20 (to 22)
              2 LOAD_NAME                0 (a)
              4 GET_ITER
        >>    6 FOR_ITER                12 (to 20)
              8 STORE_NAME               1 (i)

  3          10 LOAD_NAME                2 (print)
             12 LOAD_CONST               0 ('i')
             14 CALL_FUNCTION            1
             16 POP_TOP
             18 JUMP_ABSOLUTE            6
        >>   20 POP_BLOCK
        >>   22 LOAD_CONST               1 (None)
             24 RETURN_VALUE

字节码的作用与两个块相同这一事实无关。 pass 被忽略,因此调试器无法中断。