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.

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


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


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.


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

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


5
A co jeśli pętla to 10000000? Twoja odpowiedź jest bardzo oczywista.
hecvd
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.