פונקציית קישוט – decorator
לו אני בתפקיד האקדמיה ללשון, הייתי בוחר את המילה קשטנית, לעת עתה נשאר עם פונקציית קישוט או דקורטור או פונקציה מקשטת, שהיא דרך מקוצרת ונוחה לקחת פונקציה קיימת, ולהוסיף עליה שכבת קישוט נוספת, מבלי להתעסק עם הקוד שלה – כמו בפונקציה ממעלה גבוהה יותר ותוך ניצול היכולות המתאפשרות בפונקציות ממעלה גבוהה יותר . הכי טוב לראות בדוגמא –
def func (name): return "welcome "+name def plus (num): return num+42 def deco(f): def wrapper (*args): new=str(f(*args))+" you are the best" return new return wrapper print (func("eddie")) >>> welcome eddie print (plus(8)) >>> 50
@deco def func (name): return "welcome "+name @deco def plus (num): return num+42 print (func("eddie")) >>> welcome eddie you are the best print (plus(8)) >>> 50 you are the best
כתבנו שתי פונקציות פשוטות אחת בשם func שמקבלת בצורת מחרוזת ומחזירה את השם בצירוף המילה welcome השנייה נקראת plus והיא מקבלת מספר integer ומחזירה מספר הגדול ממנו ב- 42.
כעת נבנה פונקציית קישוט (decorator) בשם deco המקבלת פונקציה כמשתנה (f). המשתנה f מייצג את הפונקציה המקורית שלנו. לאחר מכן, נבנה תחתיה פונקציה חדשה בשם wrapper שתעטוף את הפונקציה המקורית ותבצע בה את השינוי המיוחל. תחת הפונקציה wrapper אנו קוראים לפונקציה המקורית f מבצעים את השינוי שאנו רוצים. אנו רוצים שהערך המתקבל יהפוך למחרוזת str (למקרה, למשל, שהערך הוא מספר שאינו מחרוזת) כדי שנוכל להדביק לו מחרוזת נוספת - "you are the best", שזה בעצם כל מה שתעשה פונקציית הקישוט שלנו לתוצר הפונקציה שהיא מקשטת. היות שהפונקציה המקורית שאנו מקשטים אמורה לקבל משתנים (ארגומנטים) אנו מוסיפים את המשתנה הכללי *args גם בפונקציית wrapper (שעוטפת את הפונקציה המקורית) וגם בקריאה לפונקציה המקורית (f(*args משום שאנו עדיין לא יודעים מה עושה הפונקציה שאנו עתידים לקשט ואילו ערכים היא מקבלת.
כאן מגיע החלק המורכב – התוצר של פונקציית wrapper הוא תוצר חדש המשלב את תוצר הפונקציה המקורית. והתוצר של כל פונקציית הקישוט שלנו הוא פונקציית wrapper. כלומר אנו משלבים שני אלמנטים מרעיון הפונקציה ממעלה גבוהה יותר, גם קבלת פונקציה מקורית כמשתנה (f), וגם החזרת פונקציה חדשה (wrapper).
היופי בהתגלמותו הוא בשימוש הפשוט בפונקציית הקישוט – כותבים @ (כרוכית=שטרודל) ואת שם הפונקציה המקשטת מימין לה, מעל הפונקציה שרוצים לקשט ובום...פונקציית הקישוט משנה את תוצר הפונקציה המקורית בלי שנגענו בקוד של הפונקציה המקורית.
לאחר שקישטנו את הפונקציות שלנו, אנו מבקשים להדפיס את התוצרים עם אותם המשתנים כמו קודם, לתוצרים התווסף המשפט האלמותי – "you are the best" כולל המשפט העמוק - 50 אתה הטוב ביותר.. .