حول الديكور في بيثون

مرحبا بالجميع!


تم إعداد ترجمة المقال لطلاب الدورة "مطور ويب في بيثون" . هل هو مثير للاهتمام لتطوير في هذا الاتجاه؟ اشترك في دورة "يوم الأبواب المفتوحة" وقم بالدردشة المباشرة مع المعلم: البث عبر الإنترنت في 23 يوليو في الساعة 20:00 بتوقيت موسكو!



عندما تمارس البرمجة في بيثون ، يجب أن تكون قد صادفت مفهومًا مثل الديكور. إنها واحدة من أكثر الأدوات استخدامًا والأكثر استخدامًا في المكتبات والأطر الحديثة. تعتبر الزخارف طريقة جيدة لتغليف العديد من تفاصيل التنفيذ ، تاركة واجهة بسيطة على السطح.


دعونا نلقي نظرة على مثال عن أداة تسجيل دخول بسيطة تتحقق من تسجيل دخول المستخدم قبل منحه الفرصة لتعديل النشرات. ثم يعيد الديكور توجيه صفحة تسجيل الدخول أو التسجيل ، ثم بمساعدة المعلمات المضبوطة بشكل صحيح ترجع إلى نفس الصفحة بعد المصادقة الناجحة. لاستخدام هذه الوظيفة ، تحتاج فقط إلى كتابةlogin_required قبل الوظيفة الهدف.


@login_required def edit_post(post_id): ... 

من السهل جدًا استخدام أدوات الديكور ، لكن إنشاء أدوات تزيين ليست مهمة سهلة حتى بالنسبة لمبرمجي Python ذوي الخبرة. في هذه المقالة ، سوف نلقي نظرة فاحصة على كيفية عمل الديكور في بيثون.


وظائف


تسمى الوظائف أيضًا كائنات من الدرجة الأولى في بيثون. الدوال هي نفس القيم مثل الأرقام والقوائم والسلاسل ، كما هو موضح في المثال التالي.


 >>> def foo(): ... return 1 ... >>> >>> foo() 1 >>> 

وظائف لديها مساحة الاسم الخاصة بهم ، حيث يبحثون عن أسماء المتغيرات في المقام الأول عندما تحدث في نص وظيفة. دعنا نكتب وظيفة بسيطة لفهم الفرق بين النطاق العالمي والمحلي.


 >>> >>> a_string = "This is a global variable" >>> >>> def foo(): ... print(locals()) ... >>> >>> print(globals()) {..., 'a_string': 'This is a global variable'} >>> >>> foo() # 2 {} >>> 

نطاق وظيفة كمتغير


تقول قاعدة النطاق في Python أنه عند إنشاء متغير ، يتم دائمًا إنشاء متغير محلي جديد ، ولكن يتم تحديد الوصول إلى المتغير في النطاق المحلي عندما يبحث في جميع مناطق التطابق الأقرب لأسماء المتغيرات. هذا لا يعني أننا لا نستطيع الوصول إلى المتغيرات العالمية من وظيفتنا. لإخراج متغير عمومي ، نقوم بتغيير الدالة foo كما يلي:


 >>> >>> a_string = "This is a global variable" >>> >>> def foo(): ... print(a_string) #1 ... >>> >>> foo() This is a global variable >>> 

متغير العمر


لا تعيش المتغيرات فقط في مساحة الاسم ، ولكن لها أيضًا عمر افتراضي ، وهو أمر مهم يجب تذكره. فكر في مثال يوضح ليس فقط قواعد النطاق والمشاكل التي يمكن أن تسببها ، ولكن أيضًا كيفية تفاعلها مع استدعاءات الوظائف وكيفية عملها في Python واللغات الأخرى.


 >>> def foo(): ... x = 1 ... >>> foo() >>> >>> print(x) # 1 Traceback (most recent call last): ... NameError: name 'x' is not defined >>> 

وظائف متداخلة


في Python ، يمكنك إنشاء وظائف متداخلة ، مما يعني أنه يمكننا إعلان وظائف ضمن وظائف ، ولا تزال جميع قواعد النطاق والعمر قابلة للتطبيق.


 >>> >>> def outer(): ... x = 1 ... def inner(): ... print(x) # 1 ... inner() # 2 ... >>> outer() 1 >>> 

الديكور


يُطلق على الإغلاق الذي يأخذ دالة كمعلمة ويعيد دالة اسم الديكور. النظر في مثال من الديكور مفيدة.


 >>> >>> def outer(some_func): ... def inner(): ... print("before some_func") ... ret = some_func() # 1 ... return ret + 1 ... return inner ... >>> def foo(): ... return 1 ... >>> decorated = outer(foo) # 2 >>> >>> decorated() before some_func 2 >>> 

متغير مزخرف هو نسخة مزينة من فو. في الواقع ، يمكننا استبدال foo بنسخته المزخرفة وعدم تعلم بناء الجملة الجديد ببساطة عن طريق إعادة تعيين المتغير الذي يحتوي على وظيفتنا:


 >>> >>> foo = outer(foo) >>> >>> foo # doctest: +ELLIPSIS <function outer.<locals>.inner at 0x...> >>> 

الآن لدينا ديكور جميل لتتبع المكالمات الدالة. يمكن استخدام المصممين للعمل مع أي لغة برمجة باستخدام Python. هذه أداة مفيدة للغاية ، ويجب فهم آلية العمل من أجل تطبيقها بشكل صحيح.

Source: https://habr.com/ru/post/ar460931/


All Articles