Modules – חלק 2

הקדמה

בשבוע שעבר עשינו את צעדינו הראשונים בעולם המודולים.
למדנו את הרעיון העומד מאחוריהם, כיצד לייבא אותם, איפה למצוא עליהם מידע וכיצד להשתמש בהם.
השתמשנו במודולים שמגיעים עם פייתון, כמו math, random או datetime, ופתרנו בעזרתם בעיות מורכבות.

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

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

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

איתור מודול

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

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

המקום הראשון שנפנה אליו הוא מנוע החיפוש המועדף עליכם.
נחפש מודול שמתעסק בוויקיפדיה: python module wikipedia, וננסה לקבל מושג על מודולים שעשויים לעזור לנו:

תוצאות החיפוש שהופיעו לנו בגוגל כשחיפשנו python module wikipedia

הקישור הראשון שהתקבל בתוצאות החיפוש מוביל אותנו לאתר שנקרא PyPI, או בשמו המלא – Python Package Index.
זהו האתר הרשמי של פייתון לאחסון חבילות (שאנחנו מכירים כ"מודולים") – מאגר גדול שבו חבילות מכל סוג וצורה.
בבסיסו, PyPI הוא מקום ריכוזי שאליו משתמשים יכולים להעלות חבילות שיצרו, וממנו ציבור המתכנתים יכול להוריד חבילות ולהשתמש בהן.
נכון לכתיבת מילים אלו, ל־PyPI הועלו יותר מ־235,000 חבילות.

ישנו הבדל בין משמעות המונח "חבילה" (Package) לבין משמעות המונח "מודול" (Module).
נסביר את ההבדל בין המילים באחד השבועות הבאים. עד אז – נתייחס אליהן כאל מילים נרדפות.

נכנס לקישור שהופיע בתוצאות החיפוש, ונביט על דף המודול wikipedia באתר PyPI:

דף המודול wikipedia באתר PyPI.

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

בצד ימין למעלה נוכל למצוא את תאריך העדכון האחרון של החבילה – במקרה שלנו, לפני 6 שנים, ב־2014.
מדובר בתאריך ישן וברור שהחבילה אינה מתוחזקת.
נעדיף שלא לבחור חבילות כאלו לצורכי פרויקטים גדולים שאנחנו מתכוונים לתחזק לאורך זמן.
לרוב נעדיף חבילות עם סביבת תמיכה כמה שיותר מבוססת, וכאלו שעבורן משוחררים תיקונים ועדכונים שיוצאים תדיר.

בצד שמאל נוכל לראות נתונים שמעידים, בין היתר, על הפופולריות של הפרויקט.
מדד הכוכבים הוא למעשה כמות ה"לייקים" שהפרויקט קיבל בפלטפורמה לניהול קוד בשם GitHub.
לרוב נעדיף לבחור בספריות שצברו כמה מאות כוכבים. לזו יש כמעט 2,000, מספר לא רע בכלל.

התקנת החבילה

המודול הזה נראה טוב דיו לצורכנו, והחלטנו להשתמש בו.
אם ננסה לייבא אותו, נקבל שגיאה:


In [ ]:
import wikipedia

זה מובן. פייתון מן הסתם לא יכולה להגיע עם כל ה־235,000 מודולים שפרסמה הקהילה.
אם כך, נצטרך לבחור אילו מודולים אנחנו רוצים להתקין, ולהתקין אותם לפני שנוכל להשתמש בהם.

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

כדי לפתוח את שורת הפקודה במערכת ההפעלה חלונות, לחצו על ⊞ WinKey+R במקלדת.
הלחצן ⊞ WinKey מופיע בין כפתור ה־ALT לכפתור ה־CTRL בצד השמאלי התחתון של המקלדת.
בחלון הקטן שייפתח לכם, הקישו cmd ולחצו ⏎ Enter.
בשלב זה אמור להופיע לכם על המסך חלון שחור. זוהי שורת הפקודה.

כדי לפתוח את שורת הפקודה במערכת Mac, לחצו על cmd ⌘+Space במקלדת.
בחלון שייפתח לכם, הקישו Terminal. התוכנה Terminal אמורה להופיע לכם כעת תחת המילים Top Hit.
לחצו לחיצה כפולה על Terminal.
בשלב זה אמור להופיע לכם על המסך חלון לבן. זוהי שורת הפקודה.

עכשיו, כששורת הפקודה פתוחה, נוכל להתקין את החבילה wikipedia.
נכתוב בשורת הפקודה: pip install wikipedia, ונראה את pip מתקין עבורנו את החבילה.
פקודת ההתקנה מופיעה בראש הדף של החבילה באתר PyPI, ולרוב גם בתיעוד החבילה עצמו.

אפשר להריץ פקודה בשורת הפקודה מהמחברת. פתחו תא קוד חדש, והדביקו את הפקודה כשלפניה סימן קריאה.
לדוגמה, כדי להתקין את החבילה, השתמשו ב־!pip install wikipedia

תפעול החבילה

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

חיפוש זריז בגוגל של python wikipedia module documentation יחזיר לנו את התוצאה הרביעית מהחיפוש הקודם שלנו בגוגל.
ניכנס ונריץ את שורות הקוד לדוגמה המופיעות בתיעוד:


In [ ]:
import wikipedia
wikipedia.summary('Wikipedia')

יופי! כבר עכשיו אפשר להגיד שהצלחנו במשימה שלנו לאחזר את פסקת הסיכום מוויקיפדיה לפי ערך מילוני.
לאן ממשיכים מכאן?

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


In [ ]:
import wikipedia
wikipedia.set_lang("he")
wikipedia.summary("ויקיפדיה")

מצאו אילו נקודות עניין יש ברדיוס של עד 600 מטר מהנקודה שהקואורדינטות שלה הן: קו רוחב 29.979167 וקו אורך 31.134167.
השתמשו בחבילה wikipedia ובתיעוד שלה.

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

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

ניהול חבילות

pip מאפשרת לנו לנהל את כל חבילות הפייתון שמותקנות על המחשב שלנו.
נסקור כמה פקודות שכדאי להכיר:

pip install
מאפשרת לנו להתקין חבילה חדשה, או לשדרג חבילה קיימת.
כדי לשדרג חבילה קיימת, השתמשו בדגל -U: pip install -U wikipedia.
במערכות שבהן פייתון מותקנת בהרשאות נמוכות, התקינו רק עבור המשתמש המקומי באמצעות הדגל --user: pip install --user wikipedia.
pip uninstall
מאפשרת להסיר חבילה מסוימת מהמחשב: pip uninstall wikipedia.
pip show
מאפשרת לסקור פרטים נוספים על החבילה: pip show wikipedia.
pip search
מאפשרת לחפש חבילות משורת הפקודה, לדוגמה: pip search wikipedia.
גוגל זה גם אחלה.
pip list
מאפשרת לראות את רשימת כל החבילות שהותקנו במחשב שלנו.
שימו לב שה־Anaconda שהתקנו מוסיפה לתהליך ההתקנה חבילות רבות, ולכן הרשימה שתראו מנופחת יחסית.

מונחים

PyPI
מאגר עצום המאחסן חבילות פייתון שמפתחים יצרו והעלו אליו.
המקום שממנו pip מושך את קובצי החבילות שהוא צריך להתקין.
pip
כלי המותקן יחד עם פייתון ועוזר לנו לנהל את החבילות שנמצאות על המחשב שלנו.
ראשי תיבות של Pip Install Packages.
חבילה
בניגוד למודול, שהוא קובץ פייתון אחד שניתן לייבא, חבילה היא צירוף של כמה מודולים שניתן לייבא בפקודה אחת.
בעתיד נרד לעומקו של העניין, אבל עד אז עד אז נניח שהמילים "חבילה" ו"מודול" הן נרדפות.

סיכום

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

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

תרגילים

שְׁתַּיִם דֻּבִּים מִן הַגִּיזָה

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

שימו לב: אפשר להתעלם מהערות הבודק האוטומטי.

זהות בדויה

כתבו פונקציה בשם create_people שמקבלת מספר ($n$) ומחזירה $n$ פרטי אנשים מזויפים.
"איש" מוגדר כצירוף הפרטים של שם מלא, כתובת, כתובת דואר אלקטרוני ומספר טלפון.
בחרו בעצמכם את מבני הנתונים שבהם כדאי לעשות שימוש בתרגיל זה.

זכרו זכרו

הצילו! טרוריסט משוגע מנסה לבצע פיגוע, ויכולות הפייתון שלכם הן היחידות שיכולות לעזור!
מאמצי מודיעין נרחבים הביאו אותנו למסקנה שהטרוריסט מצפין את מסריו בתמונות כך:

בכל עמודה בתמונה ישנו פיקסל אחד שצבוע בשחור.
הפיקסל צבוע במספר השורה שתואם את הערך המספרי של התו (ראו תיעוד על הפונקציות ord, chr).
אם ממירים את המיקום שבו נמצאים הפיקסלים השחורים לפי סדר, משמאל לימין, מקבלים את המסר המוכמן.

לדוגמה, אם בתמונה בגודל (2, 255) הפיקסל השמאלי נמצא בשורה מספר 72 והפיקסל הימני נמצא בשורה מספר 105, המסר המוכמן הוא "Hi".

כתבו פונקציה שמקבלת נתיב לקובץ המוצפן ומחזירה את המסר המוצפן בו.
השתמשו בקובץ resources/code.png כדי לפענח את המסר של הטרוריסט!