首页 > 解决方案 > PyCharm 在“通过”时没有达到快速和脏断点

问题描述

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

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

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

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

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

and 断点passand print, onlyprint被命中。

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


[更新] 根据@Adam.Er8 的评论表单,我尝试插入省略号文字并对其进行断点,...但这没有被击中,尽管以下print('')是。


[Updtae++] 嗯,它确实pass in

for key, value in dictionary.items(): 
    pass

标签: pythonpython-3.xpycharmbreakpoints

解决方案


实际上并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只是被忽略了,所以调试器没有什么可以中断的。


推荐阅读