פייתון היא שפה עם טיפוסים דינמיים – כלומר, סוגי המשתנים נבדקים בזמן ריצה, ואין להם טיפוס קבוע מראש.
עם זאת, ככל שפרויקטים בפייתון גדלים, רמיזות טיפוס הפכו לכלי חשוב לשיפור בהירות הקוד ולתמיכה בכלים לבדיקות סטטיות.
רמיזות הטיפוס הוכנסו בפייתון 3.5 באמצעות PEP 484, ומאפשרות לציין סוגים צפויים עבור:
- פרמטרים של פונקציות
- ערכי החזרה מפונקציות
- משתנים
- שדות במחלקות
רמיזות הטיפוס אינן נאכפות בזמן ריצה על ידי פייתון – הן למעשה משמשות כהערות עבור המתורגמן.
אבל כלים כמו בודקי טיפוסים (למשל mypy), סורקים (linters), ועורכי קוד (IDEs) יכולים להשתמש בהן כדי לזהות שגיאות טיפוס עוד לפני הרצת הקוד.
תחביר בסיסי
ניתן להוסיף רמיזות טיפוס בהגדרת פונקציה כך:
בדוגמה הזו, name: str מציין ש־name אמור להיות מסוג מחרוזת (string), ו־-> str מציין שהפונקציה מחזירה מחרוזת.
בזמן ריצה, קריאה ל־greet(5) לא תגרום לשגיאת TypeError, כי פייתון לא אוכפת את הטיפוסים בפועל, אך בודק טיפוסים סטטי כן יזהה את זה כתקלה אפשרית.
רמיזות טיפוס למשתנים ושדות במחלקות
PEP 526 הציג תחביר חדש להוספת רמיזות טיפוס למשתנים:
python
age: int = 42
זה לא מגביל את המשתנה age להיות באמת int (אפשר עדיין לבצע age = "forty-two" בזמן ריצה),
אבל זה משמש כתיעוד, וכלי בדיקה יוכלו לאתר טעויות בהתאם.
המודול typing
המודול typing בפייתון מספק מגוון עשיר של טיפוסים למבנים מורכבים יותר:
- טיפוסים גנריים ומבני נתונים: לדוגמה
List[int], Dict[str, float], Tuple[int, str] – מאפשרים לציין את סוגי האיברים בתוך מבנים.
(בפייתון 3.9 ואילך ניתן להשתמש בטיפוסים המובנים ישירות: list[int] במקום List[int]). - טיפוס אופציונלי:
Optional[X] (או התחביר החדש X | None) מציין שערך יכול להיות מסוג X או None. - איחוד טיפוסים:
Union[X, Y] (או X | Y בגרסה 3.10+) מציין שערך יכול להיות מסוג X או מסוג Y. - כינויים לטיפוסים:
ניתן ליצור שם מקוצר לטיפוס מורכב, לדוגמה:
Coordinate = Tuple[float, float] - טיפוסי פונקציות:
Callable[[ArgType1, ArgType2], ReturnType] – מתאר את החתימה של פונקציה. - משתני טיפוס:
מאפשרים לכתוב פונקציות או מחלקות גנריות – שמקבלות טיפוס כלשהו ומחזירות אותו, לדוגמה T. - מחלקות פרוטוקול (Protocol classes – לפי PEP 544):
תומכות ב־duck typing עם בדיקות סטטיות – מאפשר לבדוק אם מחלקה תואמת לפרוטוקול מסוים מבלי לרשת אותו בפועל.
שימוש ברמיזות טיפוס יכול לשפר בצורה משמעותית את התחזוקה של קוד בפרויקטים גדולים.
כלים כמו mypy (בודק טיפוסים סטטי), Pyright / Pylance (ב־VSCode), או בדיקות הקוד של PyCharm,
יכולים לזהות אי-התאמות בטיפוסים, החזרות חסרות, שגיאות תחביר הקשורות לטיפוסים ועוד – על בסיס האנוטציות הללו.
בנוסף, רמיזות טיפוס משמשות גם כתיעוד קריא עבור בני אדם,
ומבהירות את הכוונה בשימוש בפונקציות, מחלקות, ושדות.
דוגמה – שימוש ברמיזות טיפוס עם מחלקות נתונים
הדקורטור @dataclass (מהמודול dataclasses שהתווסף בפייתון 3.7+) מאפשר ליצור מחלקות שנועדו לאחסן נתונים.
הוא נשען במידה רבה על רמיזות טיפוס לצורך הגדרת השדות: