Contents
ניפוי שגיאות בסביבת עבודה Jupyter Notebook
במדריך זה:
✅ התקנה והגדרה של ipdb
✅ 3 דרכים להפעיל את המנפה (debugger)
✅ כל הפקודות החשובות של ipdb
עם דוגמאות
✅ אסטרטגיות ניפוי שגיאות בקוד אמיתי
✅ כלים חלופיים לניפוי מתקדם
1. התקנה והכנה
התקנה דרך pip:
# cmd/ bash
pip install ipdb
# jupyter notebook code cell
%pip install ipdb #`%` - magic command
ייבוא ב־Jupyter:
import ipdb
2. שלוש דרכים להפעיל ניפוי שגיאות
שיטה 1: נקודת עצירה מפורשת ipdb.set_trace
def calculate_discount(price, discount):
final_price = price * (1 - discount)
ipdb.set_trace() # עצירה כאן
return final_price * 1.1 # הוספת מס
calculate_discount(1000, 0.2)
מה קורה בפועל:
- הביצוע נעצר ב־
set_trace
- ניתן לבדוק ערכים של משתנים (
price
,discount
) - ניתן לבצע הרצה של שורה אחת בכל פעם
שיטה 2: ניפוי בדיעבד %debug
כאשר הקוד נכשל עם שגיאה:
def load_data(filename):
with open(filename) as f:
return f.read()
try:
load_data("missing_file.txt")
except Exception as e:
%debug # הפעלת debugger אחרי השגיאה
יתרון: אין צורך להכניס נקודות עצירה מראש.
שיטה 3: פקודת קסם %%debug
לניפוי של תא שלם:
%%debug
def risky_operation(x):
return 100 / x
risky_operation(0)
ה־debugger יתחיל מיד עם הרצת התא.
3. פקודות של ipdb
פקודות בסיסיות:
פקודה | תיאור | דוגמה |
---|---|---|
n (next) | מעבר לשורה הבאה בלי להיכנס לפונקציה | n |
s (step) | כניסה לפונקציה | s |
c (continue) | המשך ריצה עד לעצירה הבאה | c |
q (quit) | יציאה מה־debugger | q |
ניתוח הקוד:
פקודה | תיאור | דוגמה |
---|---|---|
l (list) | הצגת קוד סביב השורה הנוכחית | l 5,10 (שורות 5–10) |
w (where) | הדפסת stack של קריאות | w |
u / d | מעבר מעלה/מטה ב־stack | u 2 (שתי רמות למעלה) |
עבודה עם משתנים:
פקודה | תיאור | דוגמה |
---|---|---|
p (print) | הדפסת ערך משתנה | p price |
pp | הדפסה מעוצבת של אובייקטים | pp large_dict |
! | הרצת קוד פייתון ישיר | !x = 10 |
4. דוגמאות אמיתיות לניפוי
דוגמה 1: ניפוי לולאה
def find_negative(numbers):
ipdb.set_trace()
for i, num in enumerate(numbers):
if num < 0:
return i
return -1
find_negative([1, 3, -5, 10])
אסטרטגיה:
- לבדוק קלט עם
p numbers
- להשתמש ב־
n
להתקדם בתוך הלולאה - כאשר
num == -5
לבדוק את מצב המשתנים
דוגמה 2: פונקציה רקורסיבית
def factorial(n):
ipdb.set_trace()
if n == 1:
return 1
return n * factorial(n-1)
factorial(4)
שיקולים חשובים:
- השתמשו ב־
w
כדי לראות את ערימות הקריאות u 2
יעלה שתי רמות אחורהp n
יציג את ערךn
בכל רמה
5. טכניקות מתקדמות
נקודות עצירה מותנות
for i in range(100):
if i == 50:
ipdb.set_trace() # יפעל רק באיטרציה ה־50
process_data(i)
ניפוי של קוד אסינכרוני
import asyncio
async def fetch_data():
await asyncio.sleep(1)
ipdb.set_trace() # עובד ב־Jupyter עם IPython 7.0 ומעלה
return "data"
await fetch_data()
6. כלים חלופיים
debugger מובנה של Jupyter (גרסאות חדשות)
# ב־Jupyter Lab 3.0 ומעלה
from IPython.core.debugger import set_trace
set_trace() # מקביל ל־ipdb
שילוב עם VS Code
שימוש ב־debugpy
לניפוי ויזואלי:
import debugpy
debugpy.listen(5678)
debugpy.breakpoint() # נקודת עצירה עבור VS Code
כלים אחרים
- בפרויקטים גדולים:
pdb++
,debugpy
- לניפוי גרפי: עבודה עם VS Code ו־debugpy
def buggy_function(x):
return x + "10" # שגיאת טיפוס
%debug buggy_function(5)
🕵️ שיהיה ניפוי שגיאות מוצלח!