שבוע 9 – יום 2: ניהול פרויקט מרובה קבצים

יום 2 – ניהול פרויקט מרובה קבצים

במהלך הקורס, כשערכנו את הקוד שלנו בעזרת Jupyter Notebook, היה לנו נוח לנהל את כל הקוד שלנו בתא אחד. מכשעברנו לכתוב ב־Visual Code התחלנו לנהל את הקוד שלנו על גבי קובץ שנמצא במחשב.

פרויקטים רבים גדלים במהרה, ומכילים קוד מורכב שקשה לקרוא כמקשה אחת. במקרים כאלו, נוח יותר לפצל את הקוד לחלקים קטנים, כאשר לכל חלק יש מטרה אחת מוגדרת. עשינו את זה תחילה עם פונקציות, אחר כך עם מחלקות, ומכשהתקדמנו נציג יחידה אפילו גדולה יותר – קובץ.

לדוגמה, במערכת בדיקת התרגילים של הקורס, יש קובץ שאחראי למערכת הנוטיפיקציות, קובץ אחר שמנהל את המשתמשים במערכת וקובץ נוסף שמריץ את הבדיקה האוטומטית על הפתרונות שהוגשו.

אז איך זה עובד בפועל?

כדי להריץ קובץ פייתון שיצרתם באמצעות ה־IDE שלכם, תוכלו לפתוח את שורת הפקודה (Windows, Mac) במחשב שלכם ולרשום בה python PATH, כאשר PATH הוא הנתיב המלא לקובץ שאתם רוצים להריץ. לדוגמה, אם הקובץ שלי נמצא ב־C:\Users\Yam\Desktop\chess.py, אצטרך לרשום בשורת הפקודה python C:\Users\Yam\Desktop\chess.py. שורה זו תריץ את קובץ הפייתון ותדפיס את הפלט שלו למסך שלכם.

יצירת מודול

נזכיר: מודול הוא קובץ פייתוני שבתוכו קבועים, פונקציות, ייבואים ומחלקות.

כדי ליצור מודול חדש, פשוט צרו קובץ נוסף באותה תיקייה.

ניקח לדוגמה את הקבצים hi.py ואת bye.py שנמצאים באותה תיקייה.
נכתוב ב־hi.py את הקוד הבא:

print("Haiush!")

וב־bye.py את הקוד הבא:

import hi

print("Baiush!")

נריץ את הקובץ bye.py ונראה מה יפלט למסך:

❯ python bye.py
Haiush!
Baiush!

סימון נקודת התחלה

בסוף קובץ הפייתון שמריצים, נהוג לרשום את השורה הבאה:
if __name__ == '__main__':
ובהזחה שאחריה לכתוב את הקריאה לפונקציות שאנחנו רוצים להריץ.

מתי התנאי שבשורה זו מתקיים?
__name__ הוא משתנה קסם שמקבל את שם הקובץ שרץ כרגע.
זאת אומרת, אם נכתוב __name__ בתוך קובץ ששמו chess.py, הערך של __name__ יהיה שווה ל־chess.
אבל יש קאץ’: בקובץ שהפעלתם ישירות, כלומר באמצעות הפקודה python filename, ערכו של __name__ יהיה __main__. לכן התנאי שמופיע למעלה מתקיים.

למעשה, השורה הזו מסמנת את המקום שממנו מריצים את התוכנית.

נראה דוגמה.
נשנה את הקוד ב־hi.py לקוד הבא:

if __name__ == '__main__':
    print("Haiush!")

ואת הקוד ב־bye.py לקוד הבא:

import hi

if __name__ == '__main__':
    print("Baiush!")

מה ירוץ לדעתכם? נסו במחשב שלכם!
כתרגול, שנו את שורות התנאי כך ששני התנאים יתקיימו.

לקריאה נוספת:

  1. התיעוד של פייתון.
  2. תשובה ב־Stackoverflow.

יצירת חבילה

חבילה היא הצירוף של כמה מודולים יחד לכדי “מארז” אחד.
כדי ליצור חבילה נפתח תיקייה חדשה, ובה נפתח קובץ ריק חדש ששמו __init__.py – זה קובץ שיבהיר לפייתון שמדובר בחבילה.
לידו, נוכל להוסיף אילו קובצי .py (“מודולים”) שמתחשק לנו.

נדמיין שתיקיית העבודה שלנו נראית כך:

world
├── __init__.py
├── main.py
├── zoo.py
└── sounds
    ├── __init__.py
    ├── cat.py
    ├── dog.py
    └── ferret.py

אם אנחנו כותבים קוד עבור main.py ורוצים לטעון את zoo.py, נכתוב: import zoo.
אם אנחנו כותבים קוד עבור main.py ורוצים לטעון את cat.py, נכתוב: import sounds.cat או from sounds import cat.

קראו לעומק כאן ונסו בעצמכם.

תרגול

ההגשה לתרגילים הללו דורשת יכולת להעלות קבצים מרובים, ולכן היא תוכל להתבצע רק החל מצאת שבת.

תרגיל 1: נקמת ההיררכיה

צרו במחשב שלכם קבצים לפי ההיררכיה שמוצגת בפרק “יצירת חבילה” במדריך.
דאגו שהקוד הבא ב־main.py יעבוד:

from sounds import cat, dog


if __name__ == '__main__':
    cat.make_sound()
    dog.make_sound()

פלט אפשרי, לדוגמה:

Yooo
Meow

תרגיל 2: שח

חלקו את תרגיל השח ששיפצתם לכמה קבצים, כך שיהיה מסודר יותר.
השתמשו ב־import־ים כדי לגרום לו לפעול כמקשה אחת, דרך “הקובץ הראשי” שיצרתם, ושמו chess.py.

9 לייקים