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.

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


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


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.


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

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


5
Et si la boucle est de 10000000? Votre réponse est très évidente.
hecvd
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.