שרשור דקורטורים
שיעור 7 מתוך 12 בקורס דקורטורים ב-Python של Coddy.
אפשר לשרשר כמה מעטרים יחד כדי לשנות את ההתנהגות של פונקציה. כדי לשרשר מעטרים, פשוט מחילים אותם בזה אחר זה, כשהמעטר הפנימי ביותר קרוב ביותר לפונקציה שאותה מעטרים.
הנה דוגמה:
def make_bold(func):
def wrapper():
return "<b>" + func() + "</b>"
return wrapper
def make_italic(func):
def wrapper():
return "<i>" + func() + "</i>"
return wrapper
@make_bold
@make_italic
def hello():
return "Hello, world!"
print(hello())הפלט הסופי הוא:
<b><i>Hello, world!</i></b>שימו לב שבדוגמה שלמעלה המעטר מחזיר את הערך מהפונקציה; עד עכשיו ראינו רק מעטרים שמבצעים את הפונקציה בלי להחזיר את התוצאה שלה!
אתגר
בינוניכתבו פונקציה בשם my_decorator שמקבלת ארגומנט שלם n ומחזירה פונקציית דקורטור שעוטפת פונקציה נתונה func ב־n שכבות של תגיות HTML. התגית החיצונית ביותר צריכה להיות <div>, השכבה הבאה צריכה להיות <p>, וכן הלאה, כאשר כל שכבה עוקבת מתחלפת בין תגיות <div> ו־<p>. השכבה הפנימית ביותר צריכה לעטוף את פלט הפונקציה בתגיות <b>.
הקוד שיינתן לכם יופעל עם my_decorator; אל תשנו אותו!
דוגמה:
@my_decorator(3)
def my_function(s):
return s.upper()
result = my_function("hello world")
print(result)פלט:
<div>
<p>
<div>
<b>
HELLO WORLD
</b>
</div>
</p>
</div>השתמשו בשורות חדשות (
\n) כדי לעצב את הפלט כראוי!
נסו בעצמכם
# כתבו את הקוד כאן
# אל תשנו את מה שמתחת לשורה זו
n = int(input())
@my_decorator(n)
def my_function(s):
return s.upper()
result = my_function(input())
print(result)כל השיעורים ביחידה דקורטורים ב-Python
תרגלו בעצמכם: קומפיילר Python אונליין