Czym różnią się „argumenty słów kluczowych” od zwykłych argumentów? Czy nie można przekazać wszystkich argumentów jako name=value
zamiast używania składni pozycyjnej?
290
Czym różnią się „argumenty słów kluczowych” od zwykłych argumentów? Czy nie można przekazać wszystkich argumentów jako name=value
zamiast używania składni pozycyjnej?
Odpowiedzi:
Istnieją dwa powiązane pojęcia, oba nazywane „ argumentami słów kluczowych ”.
Po stronie wywołującej, o której wspominali inni komentatorzy, możesz podać niektóre argumenty funkcji według nazwy. Musisz wymienić je po wszystkich argumentach bez nazw ( argumenty pozycyjne ) i muszą istnieć wartości domyślne dla parametrów, które w ogóle nie zostały wymienione.
Druga koncepcja dotyczy definicji funkcji: możesz zdefiniować funkcję, która pobiera parametry według nazwy - i nie musisz nawet określać, jakie są te nazwy. Są to czyste argumenty słów kluczowych i nie można ich przekazywać pozycyjnie. Składnia jest następująca
Wszelkie argumenty słów kluczowych przekazane do tej funkcji zostaną umieszczone w słowniku o nazwie
kwargs
. Możesz sprawdzić klucze tego słownika w czasie wykonywania, w następujący sposób:źródło
kwargs
czy mogę zmienić nazwę na sth. jakoptions
(def my_fuction(arg1, arg2, **options)
)?kwargs
jest konwencją, gdy nie ma bardziej odpowiedniej nazwyJest jeszcze jedna ostatnia cecha językowa, w której rozróżnienie jest ważne. Rozważ następującą funkcję:
*positional
Argumentem będzie przechowywać wszystkie argumenty przekazywane do pozycyjnychfoo()
, bez limitu do ilu można zapewnić.**keywords
Argumentem będzie przechowywać żadnych argumentów słowa kluczowego:I oczywiście możesz korzystać z obu jednocześnie:
Te funkcje są rzadko używane, ale czasami są bardzo przydatne i ważne jest, aby wiedzieć, które argumenty są pozycjonujące lub słowa kluczowe.
źródło
*positional
i**keywords
jeśli zmienimy definicję funkcji jakdef foo(arg1, *positional, **keywords):
. Tutajarg1
jest pozycyjny i wymagany. Pamiętaj, że pozycja pozycyjna w odpowiedzi oznacza opcjonalną i zmienną liczbę argumentów pozycyjnych.foo(bar=True)
, możesz uzyskać wartości używając takichbar = keywords.pop('bar')
samych jakbar = keywords.pop('bar', None)
. Aby uzyskać wartość domyślną, użyjbar = keywords.pop('bar', False)
Używanie argumentów słów kluczowych jest tym samym, co zwykłe argumenty, tyle że kolejność nie ma znaczenia. Na przykład dwie poniższe funkcje są takie same:
źródło
Argumenty pozycyjne
Nie mają przed nimi słów kluczowych. Kolejność jest ważna!
Argumenty słów kluczowych
Mają słowa kluczowe z przodu. Mogą być w dowolnej kolejności!
Powinieneś także wiedzieć, że jeśli użyjesz domyślnych argumentów i zaniedbasz wstawianie słów kluczowych, wtedy kolejność będzie miała znaczenie!
źródło
func("bar", 5)
? A potem powiedzmy, żehello
otrzymuje domyślną wartość3
.Istnieją dwa sposoby przypisywania wartości argumentów do parametrów funkcji, oba są używane.
Według pozycji. Argumenty pozycyjne nie mają słów kluczowych i są przypisywane jako pierwsze.
Według słowa kluczowego. Argumenty słów kluczowych zawierają słowa kluczowe i są przypisywane jako drugie, po argumentach pozycyjnych.
Zauważ, że masz opcję użycia argumentów pozycyjnych.
Jeśli ty nie używać argumentów pozycyjnych, a następnie - tak - wszystko Ci napisałem okazuje się być argumentem kluczowym.
Kiedy ty wywołać funkcję w podjęciu decyzji do pozycji użytkowej lub słowa kluczowego lub mieszaniny. Jeśli chcesz, możesz wybrać wykonanie wszystkich słów kluczowych. Niektórzy z nas nie dokonują tego wyboru i używają argumentów pozycyjnych.
źródło
Dziwi mnie, że nikt nie zauważył, że można przekazać słownik kluczowych parametrów argumentu, które spełniają parametry formalne.
źródło
, **kwargs
. To pokazałoby, że nawet prosty func def, ze stałą liczbą parametrów, może być dostarczony ze słownikiem. Oznacza to, że nie wymaga nic szczególnego w definicji. NASTĘPNIE możesz dodać drugi przykład, Z ** kwargs w definicji, i pokazać, w jaki sposób elementy EXTRA w słowniku są dostępne za jego pośrednictwem.print 'a:%s, b:%s, c:%s' % (a, b, c)
podaje błąd składniowy, jednakprint('a:%s, b:%s, c:%s' % (a, b, c))
działa. Coś z wersją Python? W każdym razie dzięki za ten wgląd, do tej pory korzystałem z bardziejprint('a:{}, b:{}, c:{}'.format(a, b, c))
Korzystanie Python 3 można mieć zarówno wymagane, a nie wymaganych słów kluczowych argumentów :
Opcjonalne : (wartość domyślna zdefiniowana dla parametru „b”)
Wymagane (nie zdefiniowano wartości domyślnej dla parametru „b”):
Może to pomóc w przypadkach, gdy masz wiele podobnych argumentów obok siebie, szczególnie jeśli są one tego samego typu, w takim przypadku wolę używać nazwanych argumentów lub tworzę niestandardową klasę, jeśli argumenty należą do siebie.
źródło
Dziwię się, że nikt nie wspominał o tym, że można łączyć argumenty pozycyjne i słowa kluczowego, aby robić podstępne rzeczy przy użyciu
*args
i**kwargs
( z tej strony ):Pozwala to na użycie dowolnych argumentów słów kluczowych, które mogą mieć klucze, których nie chcesz definiować z góry.
źródło
Szukałem przykładu z domyślnymi kwargsami wykorzystującymi adnotacje typu:
przykład:
źródło
Wystarczy uzupełnić / dodać sposób definiowania domyślnej wartości argumentów, które nie są przypisywane słowami kluczowymi podczas wywoływania funkcji:
nazwij to przez:
dostaniesz:
czytaj więcej na temat
*args
oraz**kwargs
w python: https://www.digitalocean.com/community/tutorials/how-to-use-args-and-kwargs-in-python-3źródło