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.

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


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").


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.


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!')

-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.


5
E se o loop for 10000000? Sua resposta é muito óbvia.
hecvd
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.