python pdb - pular loop

88

Como posso pular um loop usando pdb.set_trace()?

Por exemplo,

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

print('Done!')

pdbprompts antes do loop. Eu insiro um comando. Todos os valores de 1 a 5 são retornados e eu gostaria de ser avisado pdbnovamente antes de ser print('Done!')executado.

Rhys
fonte

Respostas:

137

Experimente a untildeclaração.

Vá para a última linha do loop (com nextou n) e use untilou unt. Isso o levará para a próxima linha, logo após o loop.

http://www.doughellmann.com/PyMOTW/pdb/ tem uma boa explicação

retalhar
fonte
Do artigo: vá para a última linha do loop for usando ne digite until. Isso irá até que pelo menos a linha atual seja excedida.
sachinruk
Também funciona com compreensão de lista. Você não precisa se preocupar com a última linha.
Shiva
O que você faria se ir para a última linha do loop fosse complicado? Existe realmente nenhum equivalente ao fusado pela debugfunção de R que "termina a execução do loop ou função atual" ( adv-r.hadley.nz/debugging.html )?
Qaswed de
Usar until(ou sua forma abreviada unt) sem argumentos sempre vai descer uma linha (a menos que você acesse uma instrução return), então você também pode usá-lo várias vezes em vez de n.
Boris
Não funciona com breakpoint()definido no loop in python 3. O VB Editorpode aceitar pontos de interrupção 'dinamicamente', mas provavelmente não é o caso com pdb.
Timo
4

Você deve definir um ponto de interrupção após o loop ("break main.py:4" presumindo que as linhas acima estão em um arquivo chamado main.py) e então continuar ("c").

Mike
fonte
2

No link mencionado pela resposta aceita ( https://pymotw.com/3/pdb/ ), achei esta seção um pouco mais útil:

Para permitir que a execução seja executada até uma linha específica, passe o número da linha para o comando until.

Aqui está um exemplo de como isso pode funcionar re: loops:

insira a descrição da imagem aqui

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Isso poupa você de duas coisas: ter que criar pontos de interrupção extras e navegar até o final de um loop (especialmente quando você já pode ter iterado de forma que não seria capaz de fazer sem executar novamente o depurador).

Aqui está a documentação do Python until. A propósito, estou usando pdb++como um drop-in para o depurador padrão (daí a formatação), mas untilfunciona da mesma forma em ambos.

Zach Valenta
fonte
0

Você pode definir outro ponto de interrupção após o loop e pular para ele (durante a depuração) com c:

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

pdb.set_trace()
print('Done!')
Qaswed
fonte
-17

Se eu entendi isso corretamente.

Uma maneira possível de fazer isso seria:

Depois de receber o pdbprompt. Basta clicar em n(próximo) 10 vezes para sair do loop.

No entanto, não estou ciente de uma maneira de sair de um loop pdb.

Você pode usar rpara sair de uma função.

j_juggernaut
fonte
5
E se o loop for 10000000? Sua resposta é muito óbvia.
hecvd