python pdb - bucle de salto

88

¿Cómo puedo omitir un bucle usando pdb.set_trace()?

Por ejemplo,

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

print('Done!')

pdbmensajes antes del bucle. Introduzco un comando. Se devuelven todos los valores de 1 a 5 y luego me gustaría que se me solicitaran pdbnuevamente antes de que se print('Done!')ejecute.

Rhys
fuente

Respuestas:

137

Prueba la untildeclaración.

Vaya a la última línea del ciclo (con nexto n) y luego use untilo unt. Esto lo llevará a la siguiente línea, justo después del bucle.

http://www.doughellmann.com/PyMOTW/pdb/ tiene una buena explicación

triturar
fuente
Del artículo: vaya a la última línea del bucle for usando n, y luego escriba until. Esto continuará hasta que al menos se exceda la línea actual.
sachinruk
También funciona con listas por comprensión. No tiene que preocuparse por la última línea.
Shiva
¿Qué haría usted si ir a la última línea del bucle es engorroso? ¿Realmente no existe un equivalente al futilizado por la debugfunción de R que "finaliza la ejecución del ciclo o función actual" ( adv-r.hadley.nz/debugging.html )?
Qaswed
El uso until(o su forma abreviada unt) sin argumentos siempre irá hacia abajo en una línea (a menos que presione una declaración de retorno), por lo que también puede usarlo varias veces en lugar de n.
Boris
No funciona con breakpoint()set in the loop in python 3. El VB Editorpuede aceptar puntos de ruptura 'sobre la marcha', pero esto es más probable no es el caso con pdb.
Timo
4

Debe establecer un punto de interrupción después del bucle ("romper main.py:4" asumiendo que las líneas anteriores están en un archivo llamado main.py) y luego continuar ("c").

Miguel
fuente
2

En el enlace mencionado por la respuesta aceptada ( https://pymotw.com/3/pdb/ ), encontré esta sección algo más útil:

Para dejar que la ejecución se ejecute hasta una línea específica, pase el número de línea al comando hasta.

Aquí hay un ejemplo de cómo eso puede funcionar re: bucles:

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Le ahorra dos cosas: tener que crear puntos de interrupción adicionales y tener que navegar hasta el final de un bucle (especialmente cuando es posible que ya haya iterado de tal manera que no podría hacerlo sin volver a ejecutar el depurador).

Aquí están los documentos de Python until. Por cierto, lo estoy usando pdb++como un complemento para el depurador estándar (de ahí el formato) pero untilfunciona igual en ambos.

Zach Valenta
fuente
0

Puede establecer otro punto de interrupción después del bucle y saltar a él (al depurar) con c:

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

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

Si entendí esto correctamente.

Una forma posible de hacer esto sería:

Una vez que reciba el pdbaviso. Simplemente presione n(siguiente) 10 veces para salir del ciclo.

Sin embargo, no conozco una forma de salir de un bucle pdb.

Sin embargo, podría usar rpara salir de una función.

j_juggernaut
fuente
5
¿Y si el bucle es 10000000? Tu respuesta es muy obvia.
hecvd