Creating a Decorator
Python Decorators haqida o'rganamiz.
Dekorator Yaratish
Dekorator, asosan, boshqa bir funktsiyani argument sifatida qabul qiladigan ichma-ich funktsiya hisoblanadi. Keling, quyidagi kabi func_info() nomli funktsiyani yarataylik:
Ushbu funktsiya boshqa bir funktsiyani argument sifatida qabul qiladi. func_info() ichida wrapper() nomli yana bir funktsiya yaratasiz. Ushbu ichki funktsiya dekoratorga uzatilgan funktsiyaning nomini va docstringini ekranga chiqaradi.
Keyin, funktsiyani ishga tushurib, natijasini qaytaradi. Nihoyat, func_info() funktsiyasi wrapper() funktsiyasini qaytaradi.
Endi yangi treble() nomli funktsiya yaratib, dekoratorni unga qo‘llaylik:
Bu yerda treble() funktsiyasini func_info() dekorator funktsiyasiga uzatasiz. Keyin natijani new_treble o‘zgaruvchisiga tayinlaysiz. Keyin, new_treble() chaqirilganda, bu wrapper() funktsiyasini chaqiradi. Bu ikki qatorni chiqaradi va nihoyat func_info() funktsiyasini chaqirib, uning natijasini qaytaradi. Natija qaytarilgandan so‘ng, print() funksiyasi yordamida uni ekranga chiqarasiz.
Ushbu kodni ishga tushirganda quyidagicha natija olasiz:
func_info dekoratori muvaffaqiyatli ravishda unga uzatilgan funktsiyaning nomini aniqladi. Shuningdek, treble() funktsiyasining docstringi yo‘qligi va argument qabul qilmasligi ham ko‘rinyapti.
Keyingi qadam treble() funktsiyasini shunday yangilashdir, u argumentni qabul qilishi va docstringga ega bo‘lishi kerak. Shuningdek, dekoratorni ham yangilaymiz, shunda u bezatilayotgan funktsiyaga argumentlar uzatishi mumkin:
Birinchi qadam — wrapper() funktsiyasiga *args qo‘shish. Ikkinchi qadam esa func() chaqirig‘iga *args qo‘shishdir. Bu dekoratorning istalgan sondagi argumentlarni qabul qilishiga imkon beradi va ularni bezatilgan funktsiyaga uzatadi.
Eslatma: *args faqat wrapper ichki funktsiyasiga uzatiladi, func_info ga emas, chunki u faqat funktsiyani qabul qiladi.
Endi treble() funktsiyasini bir argument qabul qilish va uni uch martaga oshirish uchun yangilaymiz:
Endi bezatilgan funktsiyani chaqirganingizda, 5 qiymatini uzatasiz. Quyidagi natija bo‘ladi:
Python aslida funktsiyani bezatish uchun qisqaroq yo‘lni taqdim etadi. Keling, shuni ko‘rib chiqaylik!
Last updated on