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('')
和断点 pass
和 print
,只有 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
被忽略,因此调试器无法中断。
我想添加一个快速但肮脏的断点,例如当我有兴趣在迭代一个长列表的中间停止时。
for item in list:
if item == 'curry':
pass
我在pass
下了一个断点,它没有命中(!)。
如果我添加以下(空)打印
for item in list:
if item = 'curry':
pass
print('')
和断点 pass
和 print
,只有 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
被忽略,因此调试器无法中断。