python pdb - пропустить цикл


88

Как я могу пропустить цикл с помощью pdb.set_trace()?

Например,

pdb.set_trace()
for i in range(5):
     print(i)

print('Done!')

pdbподсказки перед циклом. Я ввожу команду. Возвращаются все значения от 1 до 5, и я хотел бы снова получить запрос pdbперед выполнением print('Done!').

Ответы:


137

Попробуйте untilутверждение.

Перейдите к последней строке цикла (с помощью nextили n), а затем используйте untilили unt. Вы перейдете к следующей строке сразу после цикла.

http://www.doughellmann.com/PyMOTW/pdb/ имеет хорошее объяснение


Из статьи: перейдите к последней строке цикла for с помощью n, а затем введите until. Это будет продолжаться до тех пор, пока не будет превышена хотя бы текущая строка.
sachinruk 02

Также работает с пониманием списков. Вам не нужно заботиться о последней строке.
Шива

Что бы вы сделали, если бы перейти к последней строке цикла было неудобно? Неужели нет эквивалента функции fR, debugкоторая «завершает выполнение текущего цикла или функции» ( adv-r.hadley.nz/debugging.html )?
Qaswed

Использование until(или его краткой формы unt) без аргументов всегда будет идти вниз по строке (если вы не нажмете оператор return), поэтому вы также можете просто использовать его несколько раз вместо n.
Борис

Не работает с breakpoint()установленным в петле входом python 3. VB EditorМожет принимать контрольные точки «на лету», но это, скорее всего , не в случае с pdb.
Тимо

4

Вы должны установить точку останова после цикла («break main.py:4», предполагая, что приведенные выше строки находятся в файле с именем main.py), а затем продолжить («c»).


2

В ссылке, упомянутой в принятом ответе ( https://pymotw.com/3/pdb/ ), я нашел этот раздел несколько более полезным:

Чтобы выполнение продолжалось до определенной строки, передайте номер строки команде until.

Вот пример того, как это может работать re: loops:

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

Это избавляет вас от двух вещей: необходимости создавать дополнительные точки останова и необходимости переходить к концу цикла (особенно если вы, возможно, уже выполнили итерацию, так что вы не сможете сделать это без повторного запуска отладчика).

Вот документы Python until. Кстати, я использую pdb++как добавку для стандартного отладчика (отсюда и форматирование), но untilв обоих случаях работает одинаково.


0

Вы можете установить другую точку останова после цикла и перейти к ней (при отладке) с помощью c:

pdb.set_trace()
for i in range(5):
    print(i)

pdb.set_trace()
print('Done!')

-17

Если я правильно понял.

Один из возможных способов сделать это:

Как только вы получите pdbподсказку. Просто нажмите n(следующий) 10 раз, чтобы выйти из цикла.

Однако я не знаю, как выйти из цикла pdb.

Однако вы можете использовать rдля выхода из функции.


5
А если цикл 10000000? Ваш ответ очень очевиден.
hecvd
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.