Jinsi ya kutumia hoja za urefu tofauti (*args, **kwargs) kwenye Python

Biashara

Hoja zifuatazo za kazi labda ndizo za kawaida ambazo hukuzuia unapotazama nambari ya Python na kusema, “Hii ni nini?

  • *args
  • **kwargs

Idadi yoyote ya hoja (hoja za urefu unaobadilika) inaweza kubainishwa kwa kuambatanisha kinyota kwenye hoja katika ufafanuzi wa kazi kama ifuatavyo.

  • *
  • **

Majina *args,**kwargs mara nyingi hutumika kama mkataba. Walakini, majina mengine yanakubalika maadamu * na ** yapo mwanzoni. Sampuli ya msimbo ifuatayo hutumia majina *args,**kwargs.

Maelezo yafuatayo yanaelezwa hapa chini.

  • *args:Hukubali hoja nyingi kama nakala
  • **kwargs:Hukubali hoja nyingi za manenomsingi kama kamusi

*args:Hukubali hoja nyingi kama nakala

Idadi kiholela ya hoja inaweza kubainishwa kwa kufafanua hoja na *, kama katika *args.

def my_sum(*args):
    return sum(args)

print(my_sum(1, 2, 3, 4))
# 10

print(my_sum(1, 2, 3, 4, 5, 6, 7, 8))
# 36

Hoja nyingi hupokelewa kama nakala kwenye chaguo la kukokotoa. Katika mfano, sum() chaguo za kukokotoa hupitishwa tuple ili kukokotoa jumla.

def my_sum2(*args):
    print('args: ', args)
    print('type: ', type(args))
    print('sum : ', sum(args))

my_sum2(1, 2, 3, 4)
# args:  (1, 2, 3, 4)
# type:  <class 'tuple'>
# sum :  10

Inaweza pia kuunganishwa na hoja ya msimamo.

Thamani iliyobainishwa baada ya (upande wa kulia) wa hoja ya msimamo hupitishwa kwa args kama nakala. Ikiwa kuna hoja ya msimamo tu, ni nakala tupu.

def func_args(arg1, arg2, *args):
    print('arg1: ', arg1)
    print('arg2: ', arg2)
    print('args: ', args)

func_args(0, 1, 2, 3, 4)
# arg1:  0
# arg2:  1
# args:  (2, 3, 4)

func_args(0, 1)
# arg1:  0
# arg2:  1
# args:  ()

Hoja zilizo na alama ya * zinaweza kufafanuliwa kwanza. Katika kesi hii, hata hivyo, hoja zilizofafanuliwa baadaye kuliko *args lazima zibainishwe katika fomu ya nenomsingi. Kwa bahati mbaya, umbizo la neno kuu ni fomu ya “jina la hoja = thamani”.

Thamani ya mwisho haipitishwa kiotomatiki kwa hoja ya msimamo. Kwa hivyo, ikiwa haijabainishwa kama hoja ya neno kuu, kosa la TypeError litatokea.

def func_args2(arg1, *args, arg2):
    print('arg1: ', arg1)
    print('arg2: ', arg2)
    print('args: ', args)

# func_args2(0, 1, 2, 3, 4)
# TypeError: func_args2() missing 1 required keyword-only argument: 'arg2'

func_args2(0, 1, 2, 3, arg2=4)
# arg1:  0
# arg2:  4
# args:  (1, 2, 3)

Ikiwa tu * hoja zimebainishwa, hoja zinazofuata lazima zibainishwe kama hoja za maneno msingi kila wakati.(keyword-only argument)

def func_args_kw_only(arg1, *, arg2):
    print('arg1: ', arg1)
    print('arg2: ', arg2)

# func_args_kw_only(100, 200)
# TypeError: func_args_kw_only() takes 1 positional argument but 2 were given

func_args_kw_only(100, arg2=200)
# arg1:  100
# arg2:  200

**kwargs:Hukubali hoja nyingi za manenomsingi kama kamusi

Idadi kiholela ya hoja za nenomsingi inaweza kubainishwa kwa kufafanua hoja na ,** kama katika **kwargs.

Katika fomula, jina la hoja hupokelewa kama kamusi ambayo ufunguo wake ni ufunguo na thamani yake ni thamani.

def func_kwargs(**kwargs):
    print('kwargs: ', kwargs)
    print('type: ', type(kwargs))

func_kwargs(key1=1, key2=2, key3=3)
# kwargs:  {'key1': 1, 'key2': 2, 'key3': 3}
# type:  <class 'dict'>

Inaweza pia kutumika pamoja na hoja ya msimamo.

def func_kwargs_positional(arg1, arg2, **kwargs):
    print('arg1: ', arg1)
    print('arg2: ', arg2)
    print('kwargs: ', kwargs)

func_kwargs_positional(0, 1, key1=1)
# arg1:  0
# arg2:  1
# kwargs:  {'key1': 1}

Kwa kubainisha kitu cha kamusi na ** kama hoja wakati wa kuita chaguo za kukokotoa, inawezekana kuipanua na kuipitisha kama hoja husika.

d = {'key1': 1, 'key2': 2, 'arg1': 100, 'arg2': 200}

func_kwargs_positional(**d)
# arg1:  100
# arg2:  200
# kwargs:  {'key1': 1, 'key2': 2}

Hoja zilizo na alama ya ** zinaweza tu kufafanuliwa mwishoni mwa hoja. Kufafanua hoja nyingine baada ya hoja iliyowekwa alama ya ** itasababisha hitilafu ya SyntaxError.

# def func_kwargs_error(**kwargs, arg):
#     print(kwargs)

# SyntaxError: invalid syntax