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.