יום 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!")
מה ירוץ לדעתכם? נסו במחשב שלכם!
כתרגול, שנו את שורות התנאי כך ששני התנאים יתקיימו.
לקריאה נוספת:
יצירת חבילה
חבילה היא הצירוף של כמה מודולים יחד לכדי “מארז” אחד.
כדי ליצור חבילה נפתח תיקייה חדשה, ובה נפתח קובץ ריק חדש ששמו __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.