פייתון 3.14 עשוי לחסוך לכם שאלת ראיונות עבודה מוזרה
רוצים לבלבל מועמד למשרת פייתון? שאלו אותו מה מדפיסה התוכנית הבאה:
def return_example():
try:
print("In try block")
return "Try block return"
except Exception as e:
print(f"Exception: {e}")
finally:
print("In finally block")
return "Finally block return"
result = return_example()
print(f"Result: {result}")
נו טוב, אולי זה לא כזה מבלבל כי יש רק שתי פקודות return בפונקציה ואם אנחנו שואלים על זה אז בטח התשובה לא יכולה להיות התשובה הצפויה. ואכן בפייתון בגלל שקוד שכתוב בבלוק finally תמיד ירוץ התוצאה תהיה:
In try block
In finally block
Result: Finally block return
זה קצת מוזר כי אנחנו מדמיינים שאחרי return אין כלום, אבל זה גם קצת הגיוני כי finally תמיד צריך לרוץ. בכל מקרה אם קוד מהסוג הזה בלבל גם אתכם תשמחו לשמוע שהחל מגירסה 3.14 של פייתון אי אפשר יהיה לסיים בלוק finally בפקודות return, break או continue וכך לפחות מהשטות הזאת לא נצטרך להתבלבל. כל הפרטים ב PEP:
https://peps.python.org/pep-0765/
אגב דוגמה מעניינת מה PEP של קוד אמיתי שנופל בבור הזה היתה:
try:
...
except:
return NotImplemented
finally:
return some_value
הרעיון כאן היה שמישהו רצה להחזיר ערך מסוים אם היה Exception או ערך אחר אם לא היה, אבל השימוש ב return בתוך finally ממסך על ה return של ה except וכך תמיד מוחזר הערך שמוגדר ב finally.