python pdb - saute la boucle

88

Comment puis-je sauter une boucle en utilisant pdb.set_trace()?

Par exemple,

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

print('Done!')

pdbinvite avant la boucle. J'entre une commande. Toutes les valeurs 1 à 5 sont renvoyées et j'aimerais être invité à pdbnouveau avant l' print('Done!')exécution.

Rhys
la source

Réponses:

137

Essayez la untildéclaration.

Allez à la dernière ligne de la boucle (avec nextou n) puis utilisez untilou unt. Cela vous mènera à la ligne suivante, juste après la boucle.

http://www.doughellmann.com/PyMOTW/pdb/ a une bonne explication

shreddd
la source
De l'article: accédez à la dernière ligne de la boucle for en utilisant n, puis tapez until. Cela ira jusqu'à ce qu'au moins cette ligne actuelle soit dépassée.
sachinruk
Fonctionne également avec les compréhensions de liste. Vous n'avez pas à vous soucier de la dernière ligne.
Shiva
Que feriez-vous, si aller à la dernière ligne de la boucle est fastidieux? N'y a-t-il pas vraiment d'équivalent à futilisé par la debugfonction de R qui "termine l'exécution de la boucle ou de la fonction courante" ( adv-r.hadley.nz/debugging.html )?
Qaswed le
Utiliser until(ou sa forme courte unt) sans arguments descendra toujours sur une ligne (sauf si vous appuyez sur une instruction return), vous pouvez donc également l'utiliser plusieurs fois au lieu de n.
Boris
Cela ne fonctionne pas avec breakpoint()set in the loop in python 3. Le VB Editorpeut accepter des points d'arrêt «à la volée», mais ce n'est probablement pas le cas avec pdb.
Timo
4

Vous devez définir un point d'arrêt après la boucle ("break main.py:4" en supposant que les lignes ci-dessus sont dans un fichier appelé main.py), puis continuer ("c").

Mike
la source
2

Dans le lien mentionné par la réponse acceptée ( https://pymotw.com/3/pdb/ ), j'ai trouvé cette section un peu plus utile:

Pour laisser l'exécution s'exécuter jusqu'à une ligne spécifique, transmettez le numéro de ligne à la commande jusqu'à.

Voici un exemple de comment cela peut fonctionner re: loops:

entrez la description de l'image ici

entrez la description de l'image ici

entrez la description de l'image ici

Cela vous évite deux choses: avoir à créer des points d'arrêt supplémentaires et devoir naviguer jusqu'à la fin d'une boucle (surtout lorsque vous avez peut-être déjà itéré de telle sorte que vous ne pourriez pas le faire sans relancer le débogueur).

Voici la documentation Python sur until. Btw j'utilise pdb++comme un drop-in pour le débogueur standard (d'où le formatage) mais untilfonctionne de la même manière dans les deux.

Zach Valenta
la source
0

Vous pouvez définir un autre point d'arrêt après la boucle et y accéder (lors du débogage) avec c:

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

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

Si j'ai bien compris.

Une façon possible de faire ceci serait:

Une fois que vous obtenez une pdbinvite. Appuyez simplement sur n(suivant) 10 fois pour quitter la boucle.

Cependant, je ne connais pas un moyen de sortir d'une boucle pdb.

Vous pouvez cependant utiliser rpour quitter une fonction.

j_juggernaut
la source
5
Et si la boucle est de 10000000? Votre réponse est très évidente.
hecvd