Wit, mypy, טיפול בשגיאות ומה שביניהם

לצורך הדרישה של רוב הפונקציות של wit שלא לעבוד אם בתיקיית העבודה הנוכחית (או באחת מתיקיות האב שלה) לא נמצאת התיקיה ‘.wit’, אני מבצע בפונקציות רבות בדיקה אם התיקייה קיימת ומחזיר None במקרה שלא, על מנת להפסיק את פעולת הפונקציה.
בפונקציות שמחזירות ערך זה בא לידי ביטוי באמצעות האנטוציה Optional.
מרבית (אם לא כל) הפונקציות שכתבתי יודעות גם לקבל את הנתיב לתיקייה ‘.wit’ מבדיקה קודמת על מנת לדלג על הבדיקה הנוכחית, כך שברוב הקריאות אין אופציה לקבל None במקום את סוג הערך הרצוי.
אם זאת mypy לא אוכלת (ובצדק) ומתריעה על משתנים רבים שהם לא מתאימים לסוג הפעולה המתבצעת עליהם.
כיצד ניתן להתגבר על הבעיה הזו מבלי להפציץ את הקוד בהערות סטייל type: ignore # ?

אולי במקום להחזיר None
תחזיר True או False?
ותדפיס הערה מתאימה בתוך הפונקציה
אם פולס

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

היי,

בגדול mypy צודק בנוגע לתלונה שלו. הוא מזהיר אותך מאפשרות קריסה של התוכנה אם אתה לא נמצא בתיקיית העבודה שמעליה יש .wit.
יש 2 אופציות, אחת מומלצת ואחת פחות IMHO:

  1. בכל מקום שבו אתה עלול לעבוד עם None בטעות, תכניס guard clause כשאומר if ... is None. זה יכול להיות קצת מעייף, אבל זה כנראה הצורה הנכונה להתגבר על דברים במצב הנוכחי.
  2. האופציה היותר מומלצת לעניות דעתי היא להשתמש ב־raise במקום ב־return None, ולתפוס את זה ב־main של התוכנית שלך. אני נוטה להעדיף את השיטה הזו על פני החזרות של None, כי זה מאפשר לתפוס את השגיאות הללו במקום אחד ולסיים את הריצה בצורה יפה.
לייק 1

אם אני משתמש ב-raise, האם נהוג לבצע try גם בפונקציה שבה אין שום סיכוי שאי פעם תקפוץ השגיאה או שניתן לוותר על ה-try.
שואל גם מטעמי נימוס והליכות, וגם מטעמי מיטוב ושיפור כתיבת הקוד.

אסביר את המצב:
פונקציה מסויימת מריצה בדיקה האם קיימת תיקיית ‘.wit’ ומפסיקה את פעילותה במקרה שלא. היה והתיקיה קיימת, הפונקציה ממשיכה וקוראת לפונקציה אחרת שמבצעת בדיקה דומה ועשויה (על הנייר) לזרוק שגיאה. אך למעשה, אם הגענו לקריאה לפונקציה השניה ניתן להניח שלא תזרק ממנה שגיאה.

אין צורך ואפילו עדיף שלא

לייק 1