Creating a Decorator

Python Decorators haqida o'rganamiz.

SU

Dekorator Yaratish

Dekorator, asosan, boshqa bir funktsiyani argument sifatida qabul qiladigan ichma-ich funktsiya hisoblanadi. Keling, quyidagi kabi func_info() nomli funktsiyani yarataylik:

def func_info(func):
    def wrapper():
        print('Funktsiya nomi: ' + func.__name__)
        print('Funktsiya docstringi: ' + str(func.__doc__))
        result = func()
        return result
    return wrapper

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:

def treble():
    return 3 * 3
 
new_treble = func_info(treble)
print(new_treble())

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:

Funktsiya nomi: treble
Funktsiya docstringi: None
9

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:

# first_decorator_updated.py
 
def func_info(func):
    def wrapper(*args):
        print('Funktsiya nomi: ' + func.__name__)
        print('Funktsiya docstringi: ' + str(func.__doc__))
        result = func(*args)
        return result
    return wrapper

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:

def treble(a):
    """Kiritilgan sonni uch martaga oshiruvchi funktsiya"""
    return a * 3
 
my_treble = func_info(treble)
print(my_treble(5))

Endi bezatilgan funktsiyani chaqirganingizda, 5 qiymatini uzatasiz. Quyidagi natija bo‘ladi:

Funktsiya nomi: treble
Funktsiya docstringi: Kiritilgan sonni uch martaga oshiruvchi funktsiya
15

Python aslida funktsiyani bezatish uchun qisqaroq yo‘lni taqdim etadi. Keling, shuni ko‘rib chiqaylik!

Last updated on

On this page

Xato haqida xabar berish