python pdb - bỏ qua vòng lặp


88

Làm cách nào tôi có thể bỏ qua một vòng lặp bằng cách sử dụng pdb.set_trace()?

Ví dụ,

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

print('Done!')

pdblời nhắc trước vòng lặp. Tôi nhập một lệnh. Tất cả các giá trị 1-5 được trả về và sau đó tôi muốn được nhắc pdblại trước khi print('Done!')thực thi.

Câu trả lời:


137

Hãy thử untilcâu lệnh.

Chuyển đến dòng cuối cùng của vòng lặp (với nexthoặc n) và sau đó sử dụng untilhoặc unt. Điều này sẽ đưa bạn đến dòng tiếp theo, ngay sau vòng lặp.

http://www.doughellmann.com/PyMOTW/pdb/ có một lời giải thích hay


Từ bài viết: đi đến dòng cuối cùng của vòng lặp for bằng cách sử dụng n, rồi nhập until. Điều này sẽ diễn ra cho đến khi ít nhất dòng hiện tại vượt quá.
sachinruk

Hoạt động với khả năng hiểu danh sách. Bạn không cần phải quan tâm đến dòng cuối cùng.
Shiva

Bạn sẽ làm gì, nếu việc đi đến dòng cuối cùng của vòng lặp là rườm rà? Có thực sự không có tương đương với hàm fcủa R được sử dụng để debug"hoàn thành việc thực thi vòng lặp hoặc hàm hiện tại" ( adv-r.hadley.nz/debugging.html ) không?
Đã hỏi

Việc sử dụng until(hoặc dạng rút gọn của nó unt) mà không có đối số sẽ luôn xuống dòng (trừ khi bạn nhấn câu lệnh return), vì vậy bạn cũng có thể chỉ sử dụng nó nhiều lần thay vì n.
Boris

Nó không hoạt động với breakpoint()thiết lập trong vòng lặp trong python 3. Có VB Editorthể chấp nhận các điểm ngắt 'đang bay', nhưng điều này rất có thể không đúng với trường hợp này pdb.
Timo

4

Bạn nên đặt điểm ngắt sau vòng lặp ("break main.py:4" giả sử các dòng trên nằm trong tệp có tên main.py) và sau đó tiếp tục ("c").


2

Trong liên kết được đề cập bởi câu trả lời được chấp nhận ( https://pymotw.com/3/pdb/ ), tôi thấy phần này hữu ích hơn phần nào:

Để cho phép thực thi chạy cho đến một dòng cụ thể, hãy chuyển số dòng cho lệnh Until.

Đây là một ví dụ về cách nó có thể hoạt động re: loops:

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Nó giúp bạn tránh được hai điều: phải tạo thêm các điểm ngắt và phải điều hướng đến cuối vòng lặp (đặc biệt khi bạn có thể đã lặp lại đến mức bạn sẽ không thể chạy lại trình gỡ lỗi).

Đây là tài liệu Python về until. Btw tôi đang sử dụng pdb++làm trình gỡ lỗi tiêu chuẩn (do đó định dạng) nhưng untilhoạt động giống nhau ở cả hai.


0

Bạn có thể đặt một điểm ngắt khác sau vòng lặp và chuyển đến điểm ngắt đó (khi gỡ lỗi) bằng c:

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

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

-17

Nếu tôi hiểu điều này một cách chính xác.

Một cách khả thi để làm điều này là:

Khi bạn nhận được pdblời nhắc của bạn . Chỉ cần nhấn n(tiếp theo) 10 lần để thoát khỏi vòng lặp.

Tuy nhiên, tôi không biết cách thoát khỏi vòng lặp pdb.

Bạn có thể sử dụng rđể thoát khỏi một chức năng.


5
Và nếu vòng lặp là 10000000 thì sao? Câu trả lời của bạn là rất rõ ràng.
hecvd
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.