Skip to content

ניפוי שגיאות בסביבת עבודה 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)יציאה מה־debuggerq

ניתוח הקוד:

פקודהתיאורדוגמה
l (list)הצגת קוד סביב השורה הנוכחיתl 5,10 (שורות 5–10)
w (where)הדפסת stack של קריאותw
u / dמעבר מעלה/מטה ב־stacku 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])

אסטרטגיה:

  1. לבדוק קלט עם p numbers
  2. להשתמש ב־n להתקדם בתוך הלולאה
  3. כאשר 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)

🕵️‍ שיהיה ניפוי שגיאות מוצלח!


כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *