Passing Arguments to Decorators

Python Decorators haqida o'rganamiz.

SU

Dekoratorlarga Argumentlar Uzatish

Ba'zan siz dekoratorga bitta yoki bir nechta argumentlarni uzatishingiz kerak bo'lishi mumkin. Keling, avvalgi func_info() dekoratorini olib, unga argument berib ko'ramiz va ishlashini tekshirib ko'ramiz:

# decorator_syntax_with_arguments.py
 
def func_info(func):
    def wrapper(*args):
        print('Funktsiya nomi: ' + func.__name__)
        print('Funktsiya docstring: ' + str(func.__doc__))
        result = func(*args)
        return result
    return wrapper
 
@func_info(2)
def treble(a: int) -> int:
    """Kiritilgan sonni uch marta oshiruvchi funktsiya"""
    return a * 3
 
print(treble(5))

Agar siz bu kodni ishga tushirsangiz, xato olasiz:

builtins.AttributeError: 'int' object has no attribute '__name__'

Bu xato biroz chalkash bo'lishi mumkin. Siz dekoratorga butun sonni (integer) uzatdingiz, shuning uchun dekorator butun sonni dekoratsiya qilishga harakat qilmoqda, funktsiyani emas.

Keling, kodni quyidagi tarzda qayta yozamiz:

# decorator_syntax_with_arguments.py
 
def func_info(arg1, arg2):
    print('Dekoratorning arg1 = ' + str(arg1))
    print('Dekoratorning arg2 = ' + str(arg2))
 
    def the_real_decorator(function):
 
        def wrapper(*args, **kwargs):
            print('Funktsiya {} args: {} kwargs: {}'.format(
                function.__name__,
                str(args),
                str(kwargs)))
            return function(*args, **kwargs)
 
        return wrapper
 
    return the_real_decorator
 
@func_info(3, 'Python')
def treble(number):
    return number * 3
 
print(treble(5))

Endi siz dekoratorni yozayotganda, ichma-ich funksiyalarni (nested functions) ishlatishingiz kerak. Ha, to'g'ri o'qidingiz! Bu yerda uchta funksiyani bir-biriga joylashtirasiz! func_info() endi argumentlarni qabul qiladi va bu argumentlar the_real_decorator() va wrapper tomonidan ham ishlatilishi mumkin.

wrapper() funksiyasi funktsiya nomi, argumentlar va kalit-argumentlar (kwargs) ni bitta qatorda chop etish uchun qayta yozildi.

Qolgan kodlar avvalgi kabi, faqat endi siz the_real_decorator ni qaytarasiz, bu esa o'z navbatida wrapper funksiyasini qaytaradi.

Bu kodni ishga tushirganingizda quyidagi natijani ko'rasiz:

Dekoratorning arg1 = 3
Dekoratorning arg2 = Python
Funktsiya treble args: (5,) kwargs: {}
15

Ichma-ich funksiyalarni ishlatish ba'zi hollarda qiyin bo'lishi mumkin. Yaxshiyamki, dekoratorlarga argumentlarni uzatishning boshqa usuli ham mavjud. Keling, u qanday ishlashini bilib olamiz!

Last updated on

On this page

Xato haqida xabar berish