Chaining Decorators
الدرس 7 من 12 في دورة المزخرفات في Python على Coddy.
من الممكن ربط عدة مزخرفات (decorators) معاً لتعديل سلوك دالة ما. لربط المزخرفات، ما عليك سوى تطبيقها واحداً تلو الآخر، بحيث يكون المزخرف الداخلي هو الأقرب إلى الدالة التي يتم زخرفتها.
إليك مثالاً على ذلك:
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 وتعيد دالة مزخرف (decorator) تغلف دالة معطاة 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 عبر الإنترنت