קשטנים| למה נסיון הפתרון שלי עובד אם אני מצביע לפונקציה, אבל לא אם אני קורא לה?

תגיות:

לדוגמה, נכתוב פונקציה שמדפיסה צליל של כלב:
image

ננסה לעטוף את הפונקציה בפונקציה שצועקת טקסטים בשפת האטנטרנט, ואז לקרוא ל-dog_sound:
image

ואנקונדה תצעק עלינו בחזרה שאנחנו בכלל מנסים לקרוא למחרוזת, ולא לפונקציה:
image

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

image

טאדהה!!!1~
image

מה קרה פה?
ואיך פותרים את זה? :open_mouth:


עריכה:
שכחתי def בתוך הקשתן.
זה אומר שבמקום ליצור פונקציה, ולהחזיר אותה (כדי שנריץ אותה בעצמנו אחרי זה) -
הוא כבר “עוקף” צעד, ומחזיר הרצה-של…

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

כותב את הדוגמה שלך בקוד כדי שיהיה קל יותר להתייחס אליה:

def scream_in_internet(f):
    return f().upper() + "!!!1~"


@scream_in_internet
def dog_sound():
    return "meow"


print(dog_sound)

למה dog_sound הופכת מפונקציה למחרוזת?

מזכיר מה קורה כשאנחנו כותבים decorator מעל dog_sound:

def dog_sound():
    return "meow"


dog_sound = scream_in_internet(dog_sound)


print(dog_sound)

אוקיי. מה מחזירה scream_in_internet?
את f().upper() + "!!!1~", כלומר:

  1. הקריאה ל־dog_sound המקורית
  2. הפיכה של ערך החזרה שלה לאותיות גדולות
  3. שרשור המחרוזת !!!1~ אל התוצאה.

אז scream_in_internet מחזירה "MEOW!!!1~".

זה הערך החדש של dog_sound.


איך מתקנים?

במקום להחזיר מחרוזת, נחזיר פונקציה:

def scream_in_internet(f):
    def helper(*args, **kwargs):
        return f(*args, **kwargs).upper() + "!!!1~"
    return helper
לייק 1

פאק! אתה מקליד במהירות בזק! :open_mouth:
לא הספקתי להגיב שמצאתי את הפאשלה, ושכבר הסתדרתי, וכבר שזרת פה הסברים צעד-צעד, עם דוגמאות. :open_mouth:

שאלונת אחרונה, במטותא:
האם: “helper” זהו שם נפוץ ומקובל לפונקציית-זר מן הסגנון הזה?
(או שזה סתם היה לשם הדוגמה?)

לייק 1

לא, אני לא מכיר קונבנציה בעניין.
אני חושב שבעיקר ראיתי את השם wrapper.

לייק 1