עוד שאלה על מודול צד שלישי

תגיות: ,

(סליחה על המסתורין, אבל אני רוצה להמנע מכתיבת ספוילר)
בתרגיל “זכרו זכרו” השתמשתי בספריה חיצונית ומתוכה בפרט במודול שיודע לטפל בתמונות.
היה לי שם משהו מוזר:
כשיבאתי את כל הספריה, אז הקריאה לפונקציה שיודעת לפתוח קובץ של תמונה לקריאה (-open), לא תפקדה. קיבלתי שגיאה שאומרת ש"אין דבר כזה" שנקרא open בהקשר הזה. הקריאה היא שרשור של שם הספריה, עם המודול, ואז הפונקציה של הפתיחה.
אם אני מייבאת רק את המודול המסויים מתוך הספריה, אז אין בעיה.
אני כמובן יכולה לוותר על שם הספריה בשרשור, אבל אם אני חוזרת ומייבאת את כל הספריה אחרי שייבאתי במפורש את המודול הנדרש, השרשור מתפקד בסדר.
(מבחינת הגשת התרגיל, “הכל בסדר”)
יש למישהו רעיון למה זה יכול לקרות?
אולי זה קשור לשמות השונים (ישן וחדש) של הספריה?

נניח שהספרייה היא x.
ניסית לייבא את x.open? באיזו צורה? import x.open? from x import open?
איך ניסית להשתמש בה אח"כ?


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

  1. בדיקת הגשות זה דבר מעייף ועמוס, שמצריך הרבה ריכוז וזמן. אני לא יכול להתכתב עם חניכים כי זה גם יאריך את זמני הבדיקה, וגם יוציא אותי מהפוקוס וה־zen mode.
  2. אנחנו לא נוהגים לדלג על תרגילים או לבחור תרגילי בדיקה. הבדיקה שלנו סריאלית והמערכת פשוט נותנת את התרגיל הבא בתור.
  3. אני מעדיף ששאלות מהסוג הזה יופיעו בפורום כדי שיהיה אפשר לחפש אותן אח"כ בקלות, ולא אצטרך לענות כמה פעמים על אותה שאלה.

התחלתי עם
import x
ורציתי להשתמש ב
x.y.open
(עם סוגרים אחרי ועם שם הקובץ)
קיבלתי ש ל y אין open.

לעומת זאת כשביקשתי לייבא במפורש גם את y מתוך x,
from x import y
אז גם
y.open עבד, וגם x.y.open עבד.

(בסופו של דבר ייבאתי רק את y מתוך x, ו y.open כמובן פועל)

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

המקרה שאת מתארת תואם את המצב שבו x.y הוא תת מודול. אמנם לא למדנו על הנושא לעומק, אבל ארחיב. במקרה כזה, y הוא מודול שארוז בתוך מודול האב x (נקרא “חבילה”. באופן כללי ההבדל בין חבילה למודול הוא שמודול הוא קובץ בודד, וחבילה היא אוסף של מודולים).
במקרה כזה יש 2 התנהגויות. את ההתנהגות בוחר מי שכתב את המודול:

  • הנפוצה היא ש־x טוענת באופן אוטומטי את y – זה מצריך דקה של עבודה מצד מי שכותב את המודול.
  • הפחות נפוצה היא שאפשר לייבא את x, אבל הוא לא מייבא בתוכו את x.y. במקרה כזה תצטרכי לכתוב import x.y, או from x import y.

אם תבחרי לרשום import x.y, תוכלי להשתמש בנוטציה x.y.whatever. אם תבחרי לרשום from x import y, תוכלי להשתמש ב־y.whatever. כך או כך, עדיף לעקוב אחרי תיעוד המודול ולהשתמש בו כפי שהם מציעים.

בהצלחה!

2 לייקים

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