我想添加一个快速且肮脏的断点,例如,当我有兴趣在迭代长列表时停止时。
for item in list:
if item == 'curry':
pass
我在pass
上设置了一个断点,但没有命中(!)。
如果我添加以下(空)打印件
for item in list:
if item = 'curry':
pass
print('')
同时设置断点pass
和print
,仅命中print
。
知道为什么吗? Windows 7,(便携式)Python 3.7
按照评论形式@ Adam.Er8的[更新],我尝试插入省略号文字...
并对其进行断点操作,但是没有命中,尽管以下print('')
是这样。
[Updtae ++]嗯,它 确实 碰到了pass in
for key, value in dictionary.items():
pass
答案 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
)
编辑:
您只需设置条件断点即可。