Mai mult
Utilizarea *args și **kwargs
Așa că am dificultăți cu conceptul de *args " și " **kwargs
.
Până acum am învățat că:
*args
= lista de argumente - ca argumente poziționale**kwargs
= dicționar - ale cărui chei se separe de cuvinte cheie argumentele și valorile devin valori de aceste argumente.
Eu nu't înțeleagă ceea ce de programare sarcină acest lucru ar fi de ajutor.
Poate:
Cred că pentru a intra liste și dicționare ca argumente ale unei funcții ȘI în același timp ca un wildcard, deci nu pot trece NICI un argument?
Este un exemplu simplu pentru a explica cum *args " și " **kwargs
sunt folosite?
De asemenea, tutorial am găsit folosit doar "*" și un nume de variabilă.
Sunt *args " și "**kwargs doar substituenți sau folosesti exact
*args " și " **kwargs în codul?
1361
11
Sintaxa este
* "și"**
. Numele*args " și " **kwargs
sunt numai de către convenție, dar nu's nici o cerință greu de a le folosi.Ai folosi
*args
când're nu sunt sigur cât de multe argumente ar putea fi trecut la funcție, și anume permite să treci un număr arbitrar de argumente pentru funcție. De exemplu:În mod similar,
**kwargs
vă permite să se ocupe numit argumente care nu ați definit în avans:Puteți folosi aceste, împreună cu nume de argumente prea. Explicit argumentele obține valori mai întâi și apoi totul altceva este trecut la
*args " și " **kwargs
. Numit argumente vin primele în listă. De exemplu:Puteți folosi, de asemenea, ambele în aceeași funcție definiție, dar
*args
trebuie să aibă loc înainte de**kwargs
.Puteți folosi, de asemenea,
* " și " * *
sintaxă atunci când apelați o funcție. De exemplu:După cum puteți vedea în acest caz este nevoie de lista (sau tuplu) de elemente și despachetați-l. Prin aceasta ea le potrivește cu argumente în funcție. Desigur, ai putea avea un " * " atât în definiția funcției și în apelul funcției.
Un loc în cazul în care utilizarea de
*args " și " **kwargs
este destul de util este pentru subclasarea.În acest fel puteți extinde comportamentul Foo clasă, fără a fi nevoie să știe prea multe despre Foo. Acest lucru poate fi destul de convenabil dacă sunteți programare la un API care s-ar putea schimba. MyFoo trece toate argumentele la Foo clasa.
Aici's un exemplu care folosește 3 tipuri diferite de parametri.
Aici's unul din locurile mele preferate pentru a utiliza
**
sintaxă ca și în Dave Webb's ultim exemplu:Am'm nu-s sigur dacă-l's foarte repede în comparație cu folosind doar numele ei înșiși, dar's mult mai ușor să tastați!
Un caz în care *args și **kwargs sunt utile când este scris înveliș funcții (cum ar fi decoratori) care trebuie să fie capabil de a accepta argumente arbitrare de a trece prin funcția de a fi împachetate. De exemplu, un simplu decorator care imprimă argumente și întoarce valoarea funcției fiind înfășurat:
*args și **kwargs sunt speciale-magic caracteristici de Python. Cred că de o funcție care ar putea avea un număr necunoscut de argumente. De exemplu, pentru orice motive, doriți să aveți funcție care însumează un număr necunoscut de numere (și nu't doriți să utilizați built-in funcție de sumă). Deci, vă scriu această funcție:
și să-l utilizați, cum ar fi: sumFunction(3,4,6,3,6,8,9).
kwargs are diferite funcții. Cu kwargs puteți da arbitrare de cuvinte cheie argumente pentru o funcție și le puteți accesa ca un dictonary.
De asteptare someFunction(text="foo") va imprima foo.
Doar imaginați-vă că aveți o funcție, dar nu't vreau să limiteze numărul de parametri este nevoie. Exemplu:
Apoi, utilizați această funcție, cum ar fi:
Numele
*args " și "**kwargs " sau " **kw
sunt pur prin convenție. Ea face mai ușor pentru noi să citim reciproc's codUn loc este la îndemână, este atunci când se utilizează struct module
struct.despachetați()
returnează un tuplu întrucâtstruct.pack()
utilizează un număr variabil de argumente. Atunci când manipularea datelor este convenabil pentru a fi capabil să treacă un tuplu pentru alovit.pack()
eg.fără această abilitate te-ar fi obligat să scrie
ceea ce înseamnă, de asemenea, dacă format_str modificările și dimensiunea tuplu schimbări, am'll trebuie să meargă înapoi și edita foarte lung de linie
Rețineți că *args/*kwargs este parte a funcției-de asteptare sintaxă, și nu într-adevăr un operator. Acest lucru are un anumit efect secundar care m-am întâlnit, care este că puteți't de a folosi args de expansiune cu declarația de imprimare, de imprimare nu este o funcție.
Acest lucru pare rezonabil:
Din păcate, aceasta nu't compila (eroare de sintaxă).
Aceasta compilează:
Dar imprimă argumente ca un tuplu, care e't ceea ce ne dorim.
Aceasta este soluția pe care am stabilit pe:
Acești parametri sunt de obicei folosite pentru proxy funcții, astfel încât proxy poate trece orice parametru de intrare pentru funcția țintă.
Dar când acești parametri ascunde real parametru numele, este mai bine pentru a le evita.
Puteți avea o privire la python-docs (docs.python.org în FAQ), dar mai ales pentru o bună explicație misterioasa domnișoară args și domnul kwargs (curtoazie de archive.org) (original, mort link-ul este aici).
Într-un cuvânt, ambele sunt utilizate atunci când parametrii opționali pentru o funcție sau metodă sunt folosite. Cum spune Dave, *args este utilizat atunci când nu't știu cât de multe argumente ar putea fi trecut, și **kwargs atunci când doriți să se ocupe de parametri specificate prin nume și valoare, ca în: