אם אני רוצה לעשות type annotation לפונקציה שמקבלת instance של מחלקה שלי שנמצאת במודול אחר (נגיד board), אני חייב לייבא את board לתוך הקובץ שבו אני מרמז על הטיפוס?
תודה
אם אני רוצה לעשות type annotation לפונקציה שמקבלת instance של מחלקה שלי שנמצאת במודול אחר (נגיד board), אני חייב לייבא את board לתוך הקובץ שבו אני מרמז על הטיפוס?
תודה
ממה שאני ניסיתי, כן צריך יבא אותו.
כי הקוד לא ידע במה מדובר שהטיפוס לא מיובא.
גם אני נכון לעכשיו עשיתי ככה לידיה.
כשאנחנו רוצים רמיזה של מופע מהמחלקה נעשה ככה להבנתי:
ייבוא של המחלקה הרלוונטית בתחילת הקובץ לדוגמה:
from board import Board
ואז בannotation
def func() -> Board:
וכשאנחנו רוצים לרמוז על המחלקה עצמה זה ייראה ככה אם אני לא טועה:
Type[Board]
נכון! יבוא של המודול זו הדרך הכי טובה לעשות את זה.
אבל אם המודול לא מוגדר, או יש חשש מייבוא מעגלי, אפשר גם:
תודה!
לא לגמרי הבנתי את הכוונה של 1, איך מחרוזת עם שם המחלקה יכולה לעזור לנו לרמז על הטיפוס? נטו כדי לשפר קריאות בלי באמת לאפשר לmypy להבין את זה?
אז mypy מבין את "Board"
כמחרוזת.
זה נוצר כדי לעזור לך לעשות Type Annotation אם נניח הגדרת את מחלקת A, ואתה רוצה לעשות type annotation למחלקת B שמוגדרת אחריה.
אז פייתון לא מכירה את B עדיין, ולכן הפיתרון הוא:
class A:
def __init__(self, b_instance: "B"):
self.b = b_instance
class B:
def __init__(self, a_instance: A):
self.a = a_instance
היי
שיניתי את הרמיזה לboard למחרוזת כפי שכתבת פה, כדי להימנע מייבוא מעגלי.
עכשיו הקוד כן רץ אבל mypy מעלה שגיאה- name ‘board’ is not defined.
יש דרך להינמע מהשגיאה הזו כשעושים type annotation למחלקה עם שימוש במחרוזת?
יש מצב שכתבת board במקום Board?
לא, כתבתי “Board”
ועדיין mypy מקפיץ שגיאה
אם ככה, נראה שזו האופציה שנשארה ^^"
ים יש לי איזו בעיה מעצבנת שאני לא מצליח להבין מה היא, הmypy זורק לי שגיאה על הannotations שהן מחרוזות:
אני כנראה מפספסת משהו אבל אני לא רואה איך לסדר את המודולים אחרת…
הפרדתי בין המודולים של board ו piece.
אז board חייב לקרוא לpiece בשביל בניית הלוח,
ואז בpiece בשביל לעשות type annotation לארגומנט board אני חייבת לייבא את המחלקה Board?
אני לא מצליחה לחשוב על מידול נכון שלא יגרום למעגל כזה
אני חושב שאלה בדיוק המצבים שים אמר שבהם משתמשים במחרוזת עם שם המחלקה.
כן, זו טעות שלי. שימוש במחרוזת לא יכולה לפתור ייבוא מעגלי של מודולים, רק התייחסות עתידית.
אפשר לעיין בתיעוד של mypy בחלק שעוסק בייבוא מעגלי כאן.