python pdb - salta il ciclo


88

Come posso saltare un ciclo usando pdb.set_trace()?

Per esempio,

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

print('Done!')

pdbrichiede prima del ciclo. Inserisco un comando. Vengono restituiti tutti i valori 1-5 e quindi mi piacerebbe essere pdbnuovamente richiesto prima print('Done!')dell'esecuzione.

Risposte:


137

Prova l' untilaffermazione.

Vai all'ultima riga del ciclo (con nexto n) e poi usa untilo unt. Questo ti porterà alla riga successiva, subito dopo il ciclo.

http://www.doughellmann.com/PyMOTW/pdb/ ha una buona spiegazione


Dall'articolo: vai all'ultima riga del ciclo for usando n, quindi digita until. Questo andrà fino a quando non viene superata almeno quella linea corrente.
sachinruk

Funziona anche con la comprensione delle liste. Non devi preoccuparti dell'ultima riga.
Shiva

Cosa faresti se andare all'ultima riga del ciclo fosse complicato? Non c'è davvero alcun equivalente a fusato dalla debugfunzione di R che "termina l'esecuzione del ciclo o della funzione corrente" ( adv-r.hadley.nz/debugging.html )?
Qaswed

L'uso until(o la sua forma abbreviata unt) senza argomenti andrà sempre su una riga (a meno che non si prema un'istruzione return), quindi puoi anche usarlo un po 'di volte invece di n.
Boris

Non funziona con breakpoint()set nel loop in python 3. L' VB Editorpuò accettare punti di interruzione 'al volo', ma questo è più probabile che non è il caso con pdb.
Timo

4

Dovresti impostare un punto di interruzione dopo il ciclo ("break main.py:4" presumendo che le righe precedenti siano in un file chiamato main.py) e poi continue ("c").


2

Nel collegamento menzionato dalla risposta accettata ( https://pymotw.com/3/pdb/ ), ho trovato questa sezione un po 'più utile:

Per consentire l'esecuzione fino a una riga specifica, passare il numero di riga al comando until.

Ecco un esempio di come questo può funzionare con riferimento a: loop:

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Ti risparmia da due cose: dover creare punti di interruzione extra e dover navigare alla fine di un ciclo (specialmente quando potresti aver già iterato in modo tale che non saresti in grado di farlo senza rieseguire il debugger).

Ecco i documenti di Python su until. A proposito, sto usando pdb++come drop-in per il debugger standard (da qui la formattazione) ma untilfunziona allo stesso modo in entrambi.


0

Puoi impostare un altro punto di interruzione dopo il ciclo e saltare ad esso (durante il debug) con c:

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

pdb.set_trace()
print('Done!')

-17

Se ho capito bene.

Un modo possibile per farlo sarebbe:

Una volta ottenuto il pdbprompt. Basta colpiren (avanti) 10 volte per uscire dal ciclo.

Tuttavia, non sono a conoscenza di un modo per uscire da un loop in pdb.

Potresti usare rper uscire da una funzione però.


5
E se il ciclo fosse 10000000? La tua risposta è molto ovvia.
hecvd
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.