Do czego służy pusta gwiazdka w argumentach funkcji?
Kiedy spojrzałem na moduł marynaty , widzę to:
pickle.dump(obj, file, protocol=None, *, fix_imports=True)
Wiem o pojedynczych i podwójnych gwiazdkach poprzedzających argumenty (dla zmiennej liczby argumentów), ale to nic nie poprzedza. I jestem prawie pewien, że to nie ma nic wspólnego z marynatą. To prawdopodobnie tylko przykład tego, co się dzieje. Nauczyłem się jego nazwy dopiero, gdy wysłałem to do tłumacza:
>>> def func(*):
... pass
...
File "<stdin>", line 1
SyntaxError: named arguments must follow bare *
Jeśli to ma znaczenie, korzystam z Pythona 3.3.0.
Odpowiedzi:
Gołe
*
jest używane, aby zmusić program wywołujący do używania nazwanych argumentów - więc nie można zdefiniować funkcji*
jako argumentu, gdy nie ma następujących argumentów słowa kluczowego.Aby uzyskać więcej informacji, zobacz tę odpowiedź lub dokumentację Python 3 .
źródło
*args
, muszą występować przed samą wersją*
.*
jest na miejscu*args
i odwrotnie; nie mogą współistnieć w sygnaturze. Właśnie dlatego wybrali*
; poprzednio*args
był jedynym sposobem na wymuszenie argumentów czysto pozycyjnych i oznaczał koniec argumentów, które można przekazywać pozycyjnie (ponieważ zebrał wszystkie pozostałe argumenty pozycyjne, mogły dotrzeć do następujących nazwanych argumentów).*
oznacza te same „argumenty pozycyjne nie mogą wykraczać poza to”, ale brak nazwy oznacza „ale ja ich w ogóle nie zaakceptuję, ponieważ nie zdecydowałem się na miejsce, w którym można je umieścić”.Podczas gdy oryginalna odpowiedź całkowicie odpowiada na pytanie, wystarczy dodać trochę powiązanych informacji. Zachowanie pojedynczej gwiazdki pochodzi od
PEP-3102
. Cytując pokrewną sekcję:W prostym języku angielskim oznacza to, że aby przekazać wartość klucza, musisz jawnie przekazać ją jako
key="value"
.źródło
*
pozostałych argumentów pozycyjnych, ale tak nie jest. Przekazanie dodatkowych argumentów pozycyjnych, niż oczekuje funkcja, daje tego rodzaju błąd:foo() takes exactly 1 positional argument (2 given)
powyższy przykład z ** kwargs
źródło
Semantycznie oznacza to, że następujące po nim argumenty są tylko słowami kluczowymi, więc pojawi się błąd, jeśli spróbujesz podać argument bez podania jego nazwy. Na przykład:
Pragmatycznie oznacza to, że musisz wywołać funkcję z argumentem słowa kluczowego. Zwykle robi się to, gdy trudno jest zrozumieć cel argumentu bez wskazówki podanej w nazwie argumentu.
Porównaj np.
sorted(nums, reverse=True)
Vs. jeśli napisałeśsorted(nums, True)
. Ten ostatni byłby o wiele mniej czytelny, więc programiści Pythona postanowili zmusić cię do napisania go w ten sam sposób.źródło
Załóżmy, że masz funkcję:
Możesz wywołać tę funkcję na 2 sposoby:
sum(1,2)
lubsum(1,key=2)
Załóżmy, że chcesz, aby funkcja
sum
była wywoływana tylko za pomocą argumentów słów kluczowych.Dodajesz
*
do listy parametrów funkcji, aby zaznaczyć koniec argumentów pozycyjnych.Funkcja zdefiniowana jako:
można wywołać tylko za pomocą
sum(1,key=2)
źródło
Znalazłem na poniższy link, aby być bardzo pomocny wyjaśniając
*
,*args
i**kwargs
:https://pythontips.com/2013/08/04/args-and-kwargs-in-python-explained/
Zasadniczo, oprócz powyższych odpowiedzi, dowiedziałem się z powyższej strony (kredyt: https://pythontips.com/author/yasoob008/ ), co następuje:
Po zdefiniowaniu funkcji demonstracyjnej jako pierwszej poniżej, istnieją dwa przykłady, jeden z
*args
i jeden z**kwargs
Więc
*args
pozwala dynamicznie zbudować listę argumentów, które zostaną podjęte w kolejności, w jakiej są one karmione, natomiast**kwargs
można włączyć przechodząc nazwanych argumentów, i mogą być przetwarzane przez NAME odpowiednio (niezależnie od kolejności, w jakiej są one karmione) .Strona kontynuuje, zauważając, że poprawna kolejność argumentów powinna być:
źródło