【问题标题】:PyCharm not hitting Quick and Dirty breakpoint on "pass"PyCharm 在“通过”时没有达到快速和脏断点
【发布时间】:2019-06-19 07:57:02
【问题描述】:

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

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

【问题讨论】:

    标签: python python-3.x pycharm breakpoints


    【解决方案1】:

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

    【讨论】:

    • 我可以发誓这曾经有效!有比print('') 更好的建议吗?
    • 大概你已经在循环中做了什么?你不能打破这个吗?
    • 这就是重点。我不想每次都打破循环;仅在我循环的给定值上。另请参阅该问题的最新更新。谢谢
    【解决方案2】:

    尝试将pass 替换为...

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

    你应该可以在那里断点

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

    编辑:

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

    在 PyCharm 中,这是通过右键单击 bp 并写入条件来完成的:

    【讨论】:

    • 糟糕,我的错,对不起。我只是输入了该代码作为示例;我并没有从真正的代码中腼腆。当然,我会使用相等性测试,而不是分配。我已经更新了这个问题。您正在帮助缩小范围,因为 ... 上的断点也没有命中
    • hmmm...我怀疑有一些优化,但这深入我似乎不太了解:(
    猜你喜欢
    • 1970-01-01
    • 2020-11-24
    • 2019-04-06
    • 2020-08-11
    • 2022-11-03
    • 2018-05-13
    • 2014-03-05
    • 2012-02-06
    • 2021-04-02
    相关资源
    最近更新 更多