Type annotations

תגיות:

היי,
כשאני עושה

letters: list[str]

או

 List[str]

(ניסיתי את שניהם)
אני מקבלת שגיאה -
בlist -

TypeError: 'type' object is not subscriptable

ובList

NameError: name 'List' is not defined

אני משתמשת בVS, איך אפשר להתמודד עם זה? לא מצאתי שאלה דומה… או התייחסות בהוראות ביום 3.

האם ייבאת את List מתוך typing ?

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

2 לייקים

תודה על שני הדברים :slight_smile:

לייק 1

עוד שאלה באותו נושא אם אתה יודע…
אחרי שזה עובד…
mypy לא ממש מרוצה מ-
List[Union[str,int]]
וגם כשהוא מקבל כל אחד מהם (סטרינג או אינט) הוא מתלונן… ניסיתי לפי פתרונות באינטרנט לעשות Sequence אבל גם מזה mypy לא מרוצה. אין לי ספק שזה עדיין מקבל את הטיפוסים שאני רוצה, למה זה עדיין זורק את השגיאות והאם באמת חייבים להתייחס לזה?

כש mypy זורק שגיאה הוא בד’כ גם מציע הצעות לפתרון. מה הוא מציע במקרה הזה?

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

הקוד עובד.
זה הכל על אותו עיקרון - רשימה שהגדרתי שיכולים להיות בה str או int ( ניסיתי גם sequence) ואז בתוך הפונקציה אני עושה appendים כאלה ואחרים, רק לסטרינג או לאינט… ועדיין מקבלת את השגיאות.

כנראה שמשהו לא כ"כ מדויק בהגדרות –

  • בשורה 22 את מנסה לעשות append ל־str כאשר ה־List שאליה את מנסה לעשות את ה־append הוגדרה להכיל רק intים.
  • בשורה 48 אותו דבר למשתנה שמוגדר שהוא יכול להיות או str או int, ואת מצרפת אותו לרשימה שבה הגדרת שיכולים להיות intים בלבד.

משאיר את 51 כתרגיל לקוראת :slight_smile:

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

למשל 51
letters.append(get_letter(letter))

letters
זו רשימה שמוגדרת בתוך הפונקציה עצמה ומאותחלת לרשימה ריקה, אפילו עשיתי לה type annotation ככה:
letters: List[Letters] = []
כאשר Letters -
Letters = Union[str, int]

זה מה שפתר לי את שגיאות הappend לדעתי

עכשיו להמשך על השגיאה ב51-
היא מנסה לעשות append לתוצאה של החזרה של פונקציה get_letter שאמורה לקבל רק int כvalue (הוגדר).
אני מוודאת שיגיעו רק intים עם תנאי שבתוכו כל השורה הזו יושבת של isinstance (letter, int)

ועדיין השגיאה שנזרקת זה כאילו שלחתי לתוכה Union[str,int]

מה get_letter מוגדרת לקבל?

כתבתי - אמורה לקבל int וגם עשיתי לזה רמיזה בפונקציה עצמה

ואיך הגדרת את letters, שאת מעבירה לתוכה?

כמו שכתבתי 2020202020

אני ראיתי מה כתבת, אני קורא די טוב, מנסה להפיל אסימון :slight_smile:

לייק 1

האם הארגומנט שהועבר לפונקציה תואם את איך שהפרמטר מוגדר בפונקציה?

אני מבולבלת
letters זו רשימה שיכולה לקבל int או str
מה שאני מנסה לעשות לתוכה append זה - str שחוזר מהפונקציה get_letter
למה שזה לא יעבוד?
אני באמת לא מצליחה להבין את ההגיון…
גם אם אני מורידה את הרמיזה בהגדרת letters - חוזרות הבעיות של שגיאות append

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

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

def get_letter(**value: int**, is_end: bool=False) -> str:

אני עוד לא טובה בעיצובי טקסטים פה חחח - אבל קיצר value

זה אחלה.

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

זה יעזור לנו לזקק את הבעיה