למה אתה כל כך פוחד מ Type Hints?

06/09/2023

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

1. טייפ הינטס דורשים המון התעסקות

טענה ראשונה נגד Type Hints שאני חושב שגורמת להרבה אנשים לוותר עליהם מראש היא הפחד מהתעסקות יתר - הפחד שבמקום לכתוב קוד אנחנו נתעסק רק בחיפוש הטיפוס הנכון. רגע, זה list או Sequence? ומה ההבדל בין Sequence ל Iterable? ואיך מגדירים Type Hint ל Decorator? ומה עושים עם הפונקציה שצריכה להחזיר דברים מטיפוסים שונים?

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

אם אתם מדברים עם אנשים שמרגישים כך, שווה להזכיר שאפשר להתחיל להוסיף Type Hints ממש בקטנה, ורק את אלה שאתם מכירים וקל לכם איתם, ולגדול לאט. כשיצטרכו להגדיר טיפוס יותר מתוחכם ויהיה להם זמן, הם יוכלו לחפש עליו (או להתייעץ עם איזה Chat GPT), ועד אז אין בעיה לפזר Type Hints רק במקומות שלא דורשים המון מאמץ. אפילו זה לבד ישפר את ההשלמות האוטומטיות ב IDE וייתן שכבת הגנה נגד טעויות בטיפוסים.

2. טייפ הינטס מקלקלים את ה"דינמיות" של השפה

פה אנחנו כבר מגיעים לטיעונים יותר פילוסופיים. יהיו אנשים שירגישו ש Type Hints מפריעים להם לכתוב קוד, כי הם לא רוצים להחליט מראש מה יהיו הטיפוסים של המשתנים. "בואו פשוט נגדיר פונקציה ונראה אחר כך איך יהיה נוח להשתמש בה" הם יגידו.

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

def sum_digits(n):
    sum(int(i) for i in str(n))

גם בלי לכתוב את ה Type Hint הוא הגדיר את הטיפוס של n - זהו משהו שאפשר להמיר אותו למחרוזת עם str ולקבל רצף של דברים שאפשר להמיר כל אחד מהם ל int. הפונקציה לא תעבוד על float-ים או על רשימות, בלי קשר לאם קיים או לא קיים Type Hint שאומר ש n הוא מספר.

3. טייפ הינטס רק מסבכים את הקוד בלי לתת ערך

סוג אחרון של טיעונים נגד טייפ הינטס קשור לאופציונאליות שלהם - יהיו אנשים שירגישו שבגלל שאפשר להריץ תוכניות פייתון גם כשאין תאימות לטיפוסים שמוגדרים אז ה Type Hints הם מיותרים, מבזבזים מקום בקובץ ועדיף להשקיע את האנרגיה שלנו בכתיבת תיעוד טוב יותר ובדיקות.

התשובה כאן היא שזה לא סותר והרבה פעמים אפילו הולך יחד. נכון שפייתון עצמה לא אוכפת את תאימות הטיפוסים אבל אנחנו יכולים להחליט לאכוף את זה באמצעות הוספת Commit Hook או מנגנון בדיקה ל CI שלנו שמחייב שהתוכנית תעבור mypy לפני העלאת גירסה. בנוסף ממילא התיעוד והבדיקות יגדירו את הטיפוסים שפונקציות מצפות לקבל, ולכן Type Hints יכולים רק לעזור לכתוב תיעוד טוב יותר.

בשורה התחתונה אני חושב שאחרי שעוברים את עקומת הלמידה סביב Type Hints קשה להסתכל אחורה. הערך שהם נותנים ברור במיוחד ב Refactoring כשאפשר לזהות בקלות את המקומות שמושפעים משינוי חתימה של פונקציה, ובעבודה עם קוד חדש כשאפשר לראות מהר כשמפעילים פונקציה בצורה לא נכונה.

ואם אתם רוצים להתחיל להשתמש ב Type Hints בצורה יותר רצינית בתוכניות שלכם אבל לא בטוחים שיש לכם כח לקרוא את כל התיעוד עליהם או שרוצים לקצר זמנים, תשמחו לשמוע שהקלטתי מיני קורס של שמונה שיעורים על Type Hints שמסכם את כל הטיפים והנקודות החשובות דרך דוגמאות פרקטיות לשימוש ב Type Hints. אפשר לקבל את המיני קורס בקישור הזה במסגרת רכישת מנוי לאתר.