PyCharm не задал быструю и грязную точку останова на «пасе» - PullRequest
3 голосов
/ 19 июня 2019

Я хочу добавить быструю и грязную точку останова, например, когда мне интересно остановиться в середине итерации длинного списка.

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

Ответы [ 2 ]

4 голосов
/ 19 июня 2019

pass на самом деле не превращается в байт-код.Код точно такой же, как если бы его там не было.Это можно увидеть с помощью модуля dis.(примеры использования 3.7 в Linux).

>>> 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 просто игнорируется, поэтому отладчику нечего взламывать.

2 голосов
/ 19 июня 2019

попробуйте заменить pass на ...:

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

вы должны быть в состоянии пробить там

это называется многогранный литерал , в отличие от pass он на самом деле "выполняется" (ну, вроде), и поэтому вы можете разбить его, как и любой другой оператор , но он имеет 0 побочных эффектов и читается как «ничего» (перед тем, как открыть этот трюк, я бы просто написал _ = 0)

EDIT:

Вы можете просто установить условную точку останова.

В PyCharm это делается путем щелчка правой кнопкой мыши на bp и написания условия: enter image description here

...