Jakie są zastosowania **kwargs
w Pythonie?
Wiem, że możesz zrobić objects.filter
na stole i przekazać **kwargs
argument.
Czy mogę to również zrobić, aby określić delty czasowe, tj. timedelta(hours = time1)
?
Jak to dokładnie działa? Czy klasyfikuje się jako „rozpakowywanie”? Jak a,b=1,2
?
kwargs
oznaczaKeyWord ARGumentS
, czyli argumenty, które ustawiły kluczeOdpowiedzi:
Możesz użyć,
**kwargs
aby twoje funkcje mogły pobierać dowolną liczbę argumentów słów kluczowych („kwargs” oznacza „argumenty słów kluczowych”):Możesz także użyć
**kwargs
składni podczas wywoływania funkcji, konstruując słownik argumentów słów kluczowych i przekazując go do swojej funkcji:Python Tutorial zawiera dobre wyjaśnienie, jak to działa, a także kilka ciekawych przykładów.
<-- Aktualizacja-->
Dla osób używających Python 3 zamiast iteritems (), użyj items ()
źródło
Rozpakowywanie słowników
**
rozpakowuje słowniki.To
jest taki sam jak
Jest to przydatne, jeśli musisz konstruować parametry:
Parametry pakowania funkcji
Pozwala to na użycie następującej funkcji:
źródło
** do unpack dictionaries.
>> umysł oszalały / oczywiście! +1 za wyjaśnienie tego fragmentu..iteritems()
zmieniono nazwę na.items()
Python 3.kwargs to tylko słownik dodawany do parametrów.
Słownik może zawierać pary klucz-wartość. I to są kwargsy. Okej, tak to jest.
Po co to nie jest takie proste.
Na przykład (bardzo hipotetyczny) masz interfejs, który po prostu wywołuje inne procedury w celu wykonania zadania:
Teraz otrzymujesz nową metodę „drive”:
Ale poczekaj chwilę, pojawia się nowy parametr „pojazd” - nie znałeś go wcześniej. Teraz musisz dodać go do podpisu funkcji myDo.
Tutaj możesz rzucić kwargs do gry - po prostu dodajesz kwargs do podpisu:
W ten sposób nie musisz zmieniać podpisu funkcji interfejsu za każdym razem, gdy niektóre z wywoływanych procedur mogą ulec zmianie.
To tylko jeden dobry przykład, w którym kwargs może być pomocny.
źródło
Na podstawie tego, że dobra próbka jest czasem lepsza niż długi dyskurs, napiszę dwie funkcje przy użyciu wszystkich funkcji przekazywania argumentów zmiennej python (argumenty pozycyjne i nazwane). Powinieneś łatwo zobaczyć, co robi sam:
A oto wynik:
źródło
Motyw:
*args
i**kwargs
służy jako symbol zastępczy dla argumentów, które należy przekazać do wywołania funkcjiza pomocą
*args
i**kwargs
do wywołania funkcjiTeraz użyjemy
*args
do wywołania wyżej zdefiniowanej funkcjiwynik:
arg1: dwa
arg2: 3
arg3: 5
Teraz za pomocą
**kwargs
wywołuje tę samą funkcjęwynik:
arg1: 5
arg2: dwa
arg3: 3
Konkluzja:
*args
nie ma inteligencji, po prostu interpoluje przekazane argumenty do parametrów (w kolejności od lewej do prawej),**kwargs
zachowując się inteligentnie, umieszczając odpowiednią wartość @ wymaganego miejscaźródło
kwargs
in**kwargs
to tylko nazwa zmiennej. Możesz bardzo dobrze mieć**anyVariableName
kwargs
oznacza „argumenty słów kluczowych”. Ale wydaje mi się, że lepiej je nazwać „argumentami nazwanymi”, ponieważ są to po prostu argumenty przekazywane wraz z nazwami (nie znajduję żadnego znaczenia dla słowa „słowo kluczowe” w terminie „argumenty słów kluczowych”. Myślę, że „słowo kluczowe” zwykle oznacza słowa zastrzeżone przez język programowania i dlatego nie mogą być używane przez programistę w nazwach zmiennych. W przypadku kwargs nic takiego się nie dzieje.). Więc dajemy imionaparam1
iparam2
dwie wartości parametrów przekazywanych do funkcji w następujący sposób:func(param1="val1",param2="val2")
zamiast przechodząc tylko wartości:func(val1,val2)
. Dlatego uważam, że należy je odpowiednio nazwać „dowolną liczbą nazwanych argumentów”, ponieważ możemy określić dowolną liczbę tych parametrów (to znaczyfunc
func(**kwargs)
Mówiąc to, pozwól mi najpierw wyjaśnić „nazwane argumenty”, a następnie „dowolną liczbę nazwanych argumentów”
kwargs
.Nazwane argumenty
Przykład
Dowolna liczba nazwanych argumentów
kwargs
Przykład
Przekazywanie zmiennych krotek i dict dla niestandardowych argumentów
Aby to zakończyć, zaznaczę, że możemy przejść
W ten sposób powyższe połączenie można wykonać w następujący sposób:
Wreszcie pamiętać
*
i**
w wywołań funkcji powyżej. Jeśli je pominiemy, możemy mieć złe wyniki.Pominięcie
*
argumentów krotkowych:odciski
Powyżej krotki
('custom param1', 'custom param2', 'custom param3')
jest drukowane tak, jak jest.Pominięcie
dict
argumentów:daje
źródło
keyword
terminologia wynika z faktu, że przekazujesz dyktando, które jest bazą danych par klucz-wartość.Dodatkowo możesz także łączyć różne sposoby użycia podczas wywoływania funkcji kwargs:
daje ten wynik:
Zauważ, że ** kwargs musi być ostatnim argumentem
źródło
kwargs to cukier składniowy do przekazywania argumentów nazw jako słowniki (dla func) lub słowniki jako argumenty nazwane (dla func)
źródło
Oto prosta funkcja, która służy wyjaśnieniu użycia:
Wszelkie argumenty, które nie są określone w definicji funkcji, zostaną umieszczone na
args
liście lubkwargs
liście, w zależności od tego, czy są argumentami słów kluczowych, czy nie:Jeśli dodasz argument słowa kluczowego, który nigdy nie zostanie przekazany do funkcji, pojawi się błąd:
źródło
Oto przykład, który mam nadzieję jest pomocny:
Po uruchomieniu programu otrzymujesz:
Kluczem tutaj jest to, że zmienna liczba nazwanych argumentów w wywołaniu tłumaczy się na słownik funkcji.
źródło
To prosty przykład na temat rozpakowywania Pythona ,
eg1:
źródło
W Javie używasz konstruktorów do przeciążania klas i dopuszczania wielu parametrów wejściowych. W Pythonie możesz użyć kwargs, aby zapewnić podobne zachowanie.
przykład java: https://beginnersbook.com/2013/05/constructor-overloading/
przykład python:
tylko inny sposób myślenia o tym.
źródło
Argumenty słów kluczowych są często w Pythonie skracane do kwargs . W programowaniu komputerowym ,
Użycie dwóch gwiazdek przed nazwą parametru, ** kwargs , występuje wtedy, gdy nie wiadomo, ile argumentów słowa kluczowego zostanie przekazanych do funkcji. W takim przypadku nazywa się to Arbitrary / Wildcard Keyword Arguments.
Jednym z przykładów są funkcje odbiornika Django .
Zauważ, że nie musi to być nazywane kwargs , ale musi mieć ** (nazwa kwargs to konwencja).
źródło