python pdb - pomiń pętlę

88

Jak mogę pominąć pętlę za pomocą pdb.set_trace()?

Na przykład,

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

print('Done!')

pdbmonity przed pętlą. Wpisuję polecenie. Zwracane są wszystkie wartości od 1 do 5, a następnie chciałbym otrzymać monit pdbponownie przed print('Done!')wykonaniem.

Rhys
źródło

Odpowiedzi:

137

Wypróbuj untiloświadczenie.

Przejdź do ostatniej linii pętli (używając nextlub n), a następnie użyj untillub unt. To przeniesie Cię do następnej linii, zaraz za pętlą.

http://www.doughellmann.com/PyMOTW/pdb/ ma dobre wyjaśnienie

shreddd
źródło
Z artykułu: przejdź do ostatniego wiersza pętli for, używając n, a następnie wpisz until. Będzie to trwało, dopóki przynajmniej ta bieżąca linia nie zostanie przekroczona.
sachinruk
Działa również ze składaniem list. Nie musisz przejmować się ostatnią linią.
Shiva
Co byś zrobił, gdyby przejście do ostatniej linii pętli było uciążliwe? Czy naprawdę nie ma odpowiednika funkcji fużywanej przez R, debugktóra „kończy wykonywanie bieżącej pętli lub funkcji” ( adv-r.hadley.nz/debugging.html )?
Qaswed
Użycie until(lub jego krótkiej formy unt) bez argumentów zawsze przejdzie w dół o linię (chyba że trafisz na instrukcję return), więc możesz po prostu użyć go kilka razy zamiast n.
Boris
Nie działa z breakpoint()ustawieniem w pętli python 3. VB EditorMoże zaakceptować punkty przerwania „w locie”, ale to najprawdopodobniej nie w przypadku pdb.
Timo
4

Powinieneś ustawić punkt przerwania po pętli ("break main.py:4" zakładając, że powyższe linie znajdują się w pliku o nazwie main.py), a następnie kontynuować ("c").

mikrofon
źródło
2

W linku wymienionym w zaakceptowanej odpowiedzi ( https://pymotw.com/3/pdb/ ) uważam, że ta sekcja jest nieco bardziej pomocna:

Aby umożliwić wykonanie do określonej linii, przekaż numer linii do polecenia aż do.

Oto przykład, jak to działa re: loops:

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj

Oszczędza ci to dwóch rzeczy: konieczności tworzenia dodatkowych punktów przerwania i konieczności przechodzenia do końca pętli (zwłaszcza gdy mógłbyś już wykonać iterację w taki sposób, że nie byłbyś w stanie tego zrobić bez ponownego uruchomienia debugera).

Oto dokumentacja Pythona until. Btw używam pdb++jako drop-in dla standardowego debuggera (stąd formatowanie), ale untildziała tak samo w obu.

Zach Valenta
źródło
0

Możesz ustawić inny punkt przerwania po pętli i przeskoczyć do niego (podczas debugowania) za pomocą c:

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

pdb.set_trace()
print('Done!')
Qaswed
źródło
-17

Jeśli dobrze to zrozumiałem.

Jednym z możliwych sposobów byłoby:

Gdy pojawi się pdbmonit. Po prostu naciśnij n(następny) 10 razy, aby wyjść z pętli.

Jednak nie znam sposobu na wyjście z pętli pdb.

Możesz jednak użyć rdo wyjścia z funkcji.

j_juggernaut
źródło
5
A co jeśli pętla to 10000000? Twoja odpowiedź jest bardzo oczywista.
hecvd