שגיאות של mypy בתרגיל שחמט

תגיות:

נותרו לי בתרגיל כמה שגיאות שmypy מקפיץ שאני לא מצליחה להיפתר מהן…
אשמח לעזרה:
1- המתודה במחלקת color מוגדרת בלי self וזה מקפיץ שגיאה בmypy. האם יש דרך לטפל בזה, להגדיר איכשהו את המחלקה כסטטית??
2- שגיאה של ריבוי ארגומנטים- מופיעה מספר פעמים בעיקר במתודות init שיש ירושה ושימוש ב**kwargs.
3- במחלקות ה- mixin- קופצות שגיאה על התכונה directions שהיא לא מזוהה… על אף שהיא מוגדרת במחלקת piece.
האם ניתן להתעלם משגיאות אלו או שיש דרך טובה לטפל בהן?
תודה רבה!

עוד לא הגעתי לתרגיל אז לצערי לא אוכל לעזור לך, אבל אולי זה יעזור לסעיף 3?

  1. אפשר להשתמש ב־enum כמו שהראיתי באחד הלייבים
  2. אני צריך קצת יותר קונטקסט
  3. מה שאלמוג :slight_smile:

גם אני לא הצלחתי להתגבר על שתי השגיאות: 2 ו3
מנסה להוסיף קצת יותר הֶקְשֵׁר ל 2. השגיאות הנרשמות הן:
Too many arguments for “init” of “object” - במחלקת piece ובמחלקות ה mixin
Too many arguments for “get_valid_moves” of “Piece” - במחלקות knight ו king
מה שמשותף לכולן זה ה **kwargs ב init. בחיפוש של השגיאה נראה שאולי זאת שגיאה של mypy.

לייק 1

לגבי 3 .

לייק 1

נמחק

לייק 1

גם אני תקוע על Error 2. לא מצליח לגרום ל-mixins או למחלקות אבסטרקטיות שמבצעות super עם kwargs לעבור בדיקת mypy.
מישהו יכול לעזור?

גם אני לא מסתדר עם התקלה: "Too many arguments for “ init ” of “object

אחרי יותר מדיי התעמקות בההתכתבויות בשני הקישורים:
https://github.com/python/mypy/issues/4001
https://github.com/python/mypy/issues/5887 (קישור שפורסם פה למעלה גם ע"י @nellie)

אני חושב שזו תקלה שעוד לא תוקנה, יכול להיות?

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

לייק 1

בשביל לטפל בהודעה:

"Too many arguments for “ init ” of “object

שמגיעה מהמיקסינג (נראה לי רק משם) מחקתי את השורה:

super().__init__(**kwargs)

מה init של Piece.

הקוד עובד וmypy לא מעיר לי על זה. לא יודע אם יש לזה השלכות שליליות.

יש לזה השלכות שליליות :slight_smile:
אם נחליט לצרף מעל Piece בשרשרת הירושה מחלקה אחרת, היא לא תדע לקבל את התכונות של מחלקת־העל החדשה שלה (ובפוטנציאל: גם של המחלקות שיצרו אח"כ מעליה). זה קוטע את רצף הירושה

מקווה שתענה לנו על זה בשבוע הבא :slight_smile: מאוד מורכב להבין מה עושים במקרה כזה.
אגב, זה קרה לי בעוד מקום:
כשאני מנסה להגדיר את הפונקציה is_possible_target ב-WalksMultipleStepsMixin, אני משתמש ב-Callable.
מה הבעיה?
כש-mypy קוראת אותה, היא חושבת שהפונקציה שבפועל מקבלת (board, target), צריכה לקבל גם self!
והיא כמובן גם משימה את board ו-target ל-self ו-board בהתאמה, ומחזירה too many arguments…

במקרה הזה אגב מצאתי פתרון, אבל הוא פתרון מתחמק, לא אמיתי.

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

נראה לי שמדובר פה במשהו יותר עקרוני בשרשרת ירושה (ו Piece כן מעורבת כבר בירושה) אז למה לא להשתמש ב type: ignore # במקום למחוק שורה שאולי תצטרך להחזיר?
הוא יותר עדין מלמחוק שורה ממש (הוא רק מעלים את השורה מ mypy)

2 לייקים

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

אני גם מסתכל בקוד של המחלקה עצמה ולא ב- ABC ולא ב-ABCMeta שממנה היא יורשת יש init. מה שמוביל אותי עוד לחשוב שאצלנו בקוד, כפי שהוא כתוב, הסופר לא שייך לכלום.

רק רוצה להגיד שזה שאין בהם __init__ דווקא קצת מחזק את הטענה.
אם היה בהן __init__, משמע שהן דורסות את ה־__init__ של מחלקת־העל.
דווקא כיוון שאין בהן __init__ ההתנהגות הדיפולטית היא לקרוא ל־__init__ של מחלקת העל של ABC/ABCMeta, שזה בדיוק מה שאנחנו מנסים לחקות כשאנחנו עושים super().__init__(**kwargs)

מחלקת ABC יורשת מ object (לפי ה mro), כמו כל מחלקה רגילה לא אבסטרקטית. במחברת שלימדת על מחלקות ובמחברת שלימדת על הורשה מרובה לא הוספת init במקומות האלה.

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

בקשר לenum הלייבים ירדו מהיוטיוב…אפשר הסבר?

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