Lisää
*args- ja **kwargs-arvojen käyttö
Minulla on siis vaikeuksia käsitteiden *args
ja **kwargs
kanssa.
Tähän mennessä olen oppinut, että:
*args
= argumenttiluettelo - sijaintiargumentteina.**kwargs
= sanakirja - jonka avaimista tulee erillisiä avainsana-argumentteja ja arvoista näiden argumenttien arvoja.
En ymmärrä, missä ohjelmointitehtävässä tästä olisi hyötyä.
Ehkäpä:
Luulen, että voin syöttää luetteloita ja sanakirjoja funktion argumentteina JA samalla jokerimerkkinä, jotta voin siirtää MIKÄ tahansa argumentin?
Onko olemassa yksinkertaista esimerkkiä, joka selittäisi, miten *args
ja **kwargs
käytetään?
Myös löytämässäni opetusohjelmassa käytettiin vain "*" ja muuttujan nimeä.
Ovatko *args
ja **kwargs
pelkkiä paikanvartijoita vai käytetäänkö koodissa juuri *args
ja **kwargs
?
1361
3
Syntaksi on
*
ja**
. Nimet*args
ja**kwargs
ovat vain konvention mukaisia, mutta niiden käyttämiseen ei ole mitään pakollista vaatimusta.Käytät
*args
, kun et ole varma, kuinka monta argumenttia funktiollesi välitetään, eli sen avulla voit välittää funktiollesi mielivaltaisen määrän argumentteja. Esimerkiksi:Vastaavasti
**kwargs
antaa sinulle mahdollisuuden käsitellä nimettyjä argumentteja, joita et ole määritellyt etukäteen:Voit käyttää myös näitä yhdessä nimettyjen argumenttien kanssa. Selkeät argumentit saavat arvot ensin, ja sitten kaikki muu välitetään
*args
:lle ja**kwargs
:lle. Nimetyt argumentit tulevat listassa ensimmäisenä. Esimerkiksi:Voit myös käyttää molempia samassa funktiomääritelmässä, mutta
*args
:n on oltava ennen**kwargs
:a.Voit myös käyttää
*
- ja**
-syntaksia kutsuessasi funktiota. Esimerkiksi:Kuten näet, tässä tapauksessa se ottaa listan (tai tuplan) kohteita ja purkaa sen. Näin se sovittaa ne funktion argumentteihin. Tietenkin
*
voisi olla sekä funktion määritelmässä että funktiokutsussa.Yksi paikka, jossa
*args
ja**kwargs
on varsin hyödyllinen, on aliluokittelu.Näin voit laajentaa Foo-luokan käyttäytymistä ilman, että sinun tarvitsee tietää liikaa Foo-luokasta. Tämä voi olla varsin kätevää, jos ohjelmoit API:lle, joka saattaa muuttua. MyFoo vain välittää kaikki argumentit Foo-luokalle.
Nimet
*args
ja**kwargs
tai**kw
ovat puhtaasti konvention mukaisia. Se helpottaa toistemme koodin lukemista.Yksi paikka, jossa se on kätevä, on käytettäessä struct-moduulia.
struct.unpack()
palauttaa tuplan, kun taasstruct.pack()
käyttää muuttuvaa määrää argumentteja. Kun dataa käsitellään, on kätevää pystyä antamaan tuplestruck.pack()
:lle esim.ilman tätä mahdollisuutta sinun olisi pakko kirjoittaa
mikä tarkoittaa myös sitä, että jos format_str muuttuu ja tuplen koko muuttuu, minun on palattava takaisin ja muokattava tuota todella pitkää riviä.