PyCharm没有在“通过”时达到快速和肮脏的断点

时间:2019-06-19 07:57:02

标签: python python-3.x pycharm breakpoints

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

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

我在pass上设置了一个断点,但没有命中(!)。

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

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

同时设置断点passprint,仅命中print

知道为什么吗? Windows 7,(便携式)Python 3.7


按照评论形式@ Adam.Er8的[更新],我尝试插入省略号文字...并对其进行断点操作,但是没有命中,尽管以下print('')是这样。


[Updtae ++]嗯,它 确实 碰到了pass in

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

2 个答案:

答案 0 :(得分:4)

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只是被忽略,因此调试器不会中断。

答案 1 :(得分:2)

尝试将pass替换为...

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

您应该可以在此处断点

这称为ellipsis literal,与pass不同的是,它实际上是“被执行的”(嗯,有点),这就是为什么您可以像在其他任何语句上一样将其破坏的原因,但它有0个副作用,读起来像“什么都没有”(在发现这个技巧之前,我只想写_ = 0

编辑:

您只需设置条件断点即可。

在PyCharm中,这是通过右键单击bp并编写条件来完成的: enter image description here