סוגים בפייתון
מאמר זה מסביר את הסוגים בפייתון.
YouTube Video
סוגים בפייתון
מודול typing
בפייתון משמש להוספת רמזי סוגים בפייתון. הוא הוצג לראשונה בפייתון 3.5 ומשמש לשיפור קריאות הקוד ותחזוקתו. רמזי סוגים לא משפיעים על זמן הריצה של הקוד אך מאפשרים בדיקת סוגים עם IDE וכלי ניתוח סטטיים.
יסודות רמזי הסוגים
רמזי סוגים מבהירים את כוונת הקוד על ידי ציון מפורש של סוגי הפונקציות והמשתנים. בדוגמה למטה, סוגים מצוינים עבור הפרמטרים והערך המוחזר.
1def add_numbers(a: int, b: int) -> int:
2 return a + b
3
4result: int = add_numbers(5, 10)
5print(result) # 15
בקוד שמעל, a
ו-b
הם מסוג שלם (int
), והערך המוחזר של הפונקציה מצוין גם הוא במפורש כשלם. גם עם רמזי סוגים, הסוגים אינם נאכפים באופן קשיח, אך אזהרות עשויות להופיע במהלך הפיתוח במקרה של חוסר התאמה בסוגים.
רמזי הסוגים העיקריים
מודול typing
בפייתון מספק מגוון מחלקות ופונקציות להגדרת רמזי סוגים. להלן רשימה של רמזי סוגים נפוצים.
int
: מספר שלםstr
: מחרוזתfloat
: מספר נקודה צפהbool
: בוליאניList
: רשימהDict
: מילוןTuple
: רשומה (tuple)Set
: קבוצה
סוג List
סוג הרשימה מוגדר באמצעות המחלקה List
. ניתן גם להגדיר במפורש את סוג האלמנטים בתוך רשימה.
1from typing import List
2
3def sum_list(numbers: List[int]) -> int:
4 return sum(numbers)
5
6print(sum_list([1, 2, 3])) # 6
בדוגמה זו, כל האלמנטים ברשימה צפויים להיות מסוג int
.
סוג Dict
סוג מילון מוגדר באמצעות Dict
. ניתן להגדיר את סוגי המפתחות והערכים.
1from typing import Dict
2
3def get_student_age(students: Dict[str, int], name: str) -> int:
4 return students.get(name, 0)
5
6students = {"Alice": 23, "Bob": 19}
7print(get_student_age(students, "Alice")) # 23
בדוגמה זו, המילון משתמש ב-str
כסוג המפתחות וב-int
כסוג הערכים.
סוג Tuple
טאפלים מוגדרים באמצעות סוג Tuple
. ניתן להגדיר את הסוג של כל אלמנט בטאפל באופן פרטני.
1from typing import Tuple
2
3def get_person() -> Tuple[str, int]:
4 return "Alice", 30
5
6name, age = get_person()
7print(name, age) # Alice 30
כאן, הפונקציה get_person
מוצגת ומחזירה טאפל שמכיל מחרוזת ומספר שלם.
סוג Union
סוג Union
משמש לציון מפורש כי מספר סוגים מקובלים.
1from typing import Union
2
3def process_value(value: Union[int, float]) -> float:
4 return value * 2.0
5
6print(process_value(10)) # 20.0
7print(process_value(3.5)) # 7.0
בדוגמה זו, הפונקציה process_value
מקבלת כארגומנט int
או float
ומחזירה תוצאה מסוג float
.
סוג Optional
סוג Optional
משמש כאשר משתנה עשוי להיות None
. הוא מסופק כקיצור ל-Union[Type, None]
.
1from typing import Optional
2
3def greet(name: Optional[str] = None) -> str:
4 if name is None:
5 return "Hello, Guest!"
6 return f"Hello, {name}!"
7
8print(greet()) # Hello, Guest!
9print(greet("Alice")) # Hello, Alice!
כאן, זה מראה שכאשר name
אינו מוגדר, הוא נחשב ל-None
.
סוגים גנריים
סוגים גנריים הם דרך לייצג באופן מופשט איזה סוג של אלמנטים מכילה מבנה הנתונים. במודול typing
, ניתן להגדיר סוגים גנריים באמצעות TypeVar
.
1from typing import TypeVar, List
2
3T = TypeVar('T')
4
5def get_first_element(elements: List[T]) -> T:
6 return elements[0]
7
8print(get_first_element([1, 2, 3])) # 1
9print(get_first_element(["a", "b", "c"])) # a
בדוגמה זו, get_first_element
היא פונקציה שמחזירה את האלמנט הראשון ברשימה, ופועלת ללא תלות בסוג הרשימה.
כינויי סוגים
כינוי סוגים הוא דרך לפשט הגדרות סוג מורכבות באמצעות מתן שם ברור.
1from typing import List, Tuple
2
3Coordinates = List[Tuple[int, int]]
4
5def get_coordinates() -> Coordinates:
6 return [(0, 0), (1, 1), (2, 2)]
7
8print(get_coordinates()) # [(0, 0), (1, 1), (2, 2)]
בדוגמה זו, כינוי סוג Coordinates
מוגדר כדי לייצג באופן פשוט סוג שכולל טאפלים בתוך רשימה.
סיכום
המודול typing
בפייתון הוא שימושי מאוד לשיפור הקריאות והתחזוקה של הקוד. על ידי שימוש נכון ברמזי סוג, ניתן לסייע במניעת אי התאמות סוגים ובאגים, במיוחד בפרויקטים גדולים או בפיתוח צוותי. סוגים הם רק כלי תמיכה בפיתוח ואינם משפיעים על התנהגות בזמן ריצה, ובכך שומרים על גמישות הקוד.
תוכלו לעקוב אחר המאמר שלמעלה באמצעות Visual Studio Code בערוץ היוטיוב שלנו. נא לבדוק גם את ערוץ היוטיוב.