סוגים בפייתון

סוגים בפייתון

מאמר זה מסביר את הסוגים בפייתון.

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 בערוץ היוטיוב שלנו. נא לבדוק גם את ערוץ היוטיוב.

YouTube Video