Instance of custom type annotation

תגיות: ,

אם אני רוצה לעשות type annotation לפונקציה שמקבלת instance של מחלקה שלי שנמצאת במודול אחר (נגיד board), אני חייב לייבא את board לתוך הקובץ שבו אני מרמז על הטיפוס?

תודה :slight_smile:

2 לייקים

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

2 לייקים

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

from board import Board

ואז בannotation

def func() -> Board:

וכשאנחנו רוצים לרמוז על המחלקה עצמה זה ייראה ככה אם אני לא טועה:
Type[Board]

3 לייקים

נכון! יבוא של המודול זו הדרך הכי טובה לעשות את זה.

אבל אם המודול לא מוגדר, או יש חשש מייבוא מעגלי, אפשר גם:

  1. להשתמש במחרוזת “Board” במקום
  2. לפתור את הבעיה של היבוא המעגלי על ידי חלוקה טובה יותר למודולים

תודה!

לא לגמרי הבנתי את הכוונה של 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
3 לייקים

היי
שיניתי את הרמיזה לboard למחרוזת כפי שכתבת פה, כדי להימנע מייבוא מעגלי.
עכשיו הקוד כן רץ אבל mypy מעלה שגיאה- name ‘board’ is not defined.
יש דרך להינמע מהשגיאה הזו כשעושים type annotation למחלקה עם שימוש במחרוזת?

יש מצב שכתבת board במקום Board?

לא, כתבתי “Board” :confused:
ועדיין mypy מקפיץ שגיאה

אם ככה, נראה שזו האופציה שנשארה ^^"

ים יש לי איזו בעיה מעצבנת שאני לא מצליח להבין מה היא, הmypy זורק לי שגיאה על הannotations שהן מחרוזות:
image

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

אני חושב שאלה בדיוק המצבים שים אמר שבהם משתמשים במחרוזת עם שם המחלקה.

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

אפשר לעיין בתיעוד של mypy בחלק שעוסק בייבוא מעגלי כאן.

4 לייקים