What are *args and **kwargs?

Ko'pincha sizning funksiyalaringiz faqat bir nechta argumentlar, kalit so'z argumentlari yoki ikkalasini ham qabul qilishini xohlaysiz.

SU

*args va **kwargs Nima?

Ko'pincha sizning funksiyalaringiz faqat bir nechta argumentlar, kalit so'z argumentlari yoki ikkalasini ham qabul qilishini xohlaysiz. Siz ko'p argumentlardan foydalanishni xohlamaysiz, chunki bu funksiyangizni keyinchalik o'zgartirishni qiyinlashtirishi mumkin.

Biroq, Python har qanday sonli argumentlar yoki kalit so'z argumentlari tushunchasini qo'llab-quvvatlaydi. Siz ushbu maxsus sintaksisni funksiyalaringizda ishlatishingiz mumkin:

  • *args - Istalgan sonli argumentlar
  • **kwargs - Istalgan sonli kalit so'z argumentlari

Diqqat qilishingiz kerak bo'lgan qism * va ** hisoblanadi. Arg yoki kwarg nomi har qanday bo'lishi mumkin, lekin odatda ularni args va kwargs deb nomlash odatiy hisoblanadi. Boshqa so'z bilan aytganda, ko'plab Python dasturchilari ularni *args yoki **kwargs deb atashadi. Buni qilishga majbur emassiz, lekin kodingizni tanish va tushunarli qilish uchun shunday qilish yaxshidir.

Keling, misolga qaraylik:

>>> def any_args(*args):
...     print(args)
...
>>> any_args(1, 2, 3)
(1, 2, 3)
>>> any_args(1, 2, 'Mike', 4)
(1, 2, 'Mike', 4)

Bu yerda siz any_args() funksiyasini yaratdingiz, u nolga teng bo'lgan istalgan sonli argumentlarni qabul qiladi va ularni chop etadi.

Siz haqiqatan ham bitta majburiy argument va istalgan sonli qo'shimcha argumentlarga ega bo'lgan funktsiyani yaratishingiz mumkin:

>>> def one_required_arg(required, *args):
...     print(f'{required=}')
...     print(args)
...
>>> one_required_arg('Mike', 1, 2)
required='Mike'
(1, 2)

Bu misolda, funksiyaning birinchi argumenti majburiydir. Agar siz one_required_arg() funksiyasini hech qanday argumentlarsiz chaqirsangiz, xato olasiz.

Endi kalit so'z argumentlarini qo'shishga harakat qilaylik:

>>> def any_keyword_args(**kwargs):
...     print(kwargs)
...
>>> any_keyword_args(1, 2, 3)
Traceback (most recent call last):
  Python Shell, prompt 7, line 1
builtins.TypeError: any_keyword_args() takes 0 positional arguments but 3 were given

Oops! Siz funktsiyani kalit so'z argumentlarini qabul qilish uchun yaratdingiz, lekin oddiy argumentlarni kiritdingiz. Bu TypeError xatosini keltirib chiqardi.

Endi shu qiymatlarni kalit so'z argumentlari sifatida kiritishga harakat qilaylik:

>>> any_keyword_args(one=1, two=2, three=3)
{'one': 1, 'two': 2, 'three': 3}

Bu safar kutganingizdek ishladi.

Endi biz *args va **kwargs ni tekshirib ko'raylik va ular nima ekanligini bilib olaylik:

>>> def arg_inspector(*args, **kwargs):
...     print(f'args are of type {type(args)}')
...     print(f'kwargs are of type {type(kwargs)}')
...
>>> arg_inspector(1, 2, 3, x='test', y=5)
args are of type <class 'tuple'>
kwargs are of type <class 'dict'>

Bu, args - bu tuple va kwargs esa dict ekanligini anglatadi.

Keling, funksiyamizga *args va **kwargs uchun tuple va dict ni uzatishga harakat qilaylik:

>>> my_tuple = (1, 2, 3)
>>> my_dict = {'one': 1, 'two': 2}
>>> def output(*args, **kwargs):
...     print(f'{args=}')
...     print(f'{kwargs=}')
...
>>> output(my_tuple)
args=((1, 2, 3),)
kwargs={}
>>> output(my_tuple, my_dict)
args=((1, 2, 3), {'one': 1, 'two': 2})
kwargs={}

Bu yaxshi ishlamadi. Ikkala tuple va dict *args ga kirdi. Shunday qilib, tuple uchta argumentga bo'linmadi.

Buni maxsus sintaksis yordamida ishlatishingiz mumkin:

>>> output(*my_tuple)
args=(1, 2, 3)
kwargs={}
>>> output(**my_dict)
args=()
kwargs={'one': 1, 'two': 2}
>>> output(*my_tuple, **my_dict)
args=(1, 2, 3)
kwargs={'one': 1, 'two': 2}

Bu misolda, siz output() funksiyasini *my_tuple bilan chaqirasiz. Python tuple ichidagi alohida qiymatlarni chiqaradi va har birini argument sifatida uzatadi. Keyin siz **my_dict ni uzatasiz, bu Python ga har bir kalit/qiymat juftligini kalit so'z argumentlari sifatida uzatish kerakligini bildiradi.

Yakuniy misol esa ikkita tuple va dict ni birgalikda uzatadi.

Qanday ajoyib!

Ushbu sahifada

Xato haqida xabar berish