2013-08-26 18 views
5

Studiował się na kolejny róg ...func (* args, ** kwargs, x) rzucanie nieprawidłowa składnia

def superfunction(*args, **kwargs, k): 
           ^
SyntaxError: invalid syntax 

Jaka jest zasada Im łamanie tutaj? Wygląda na to, że nie należy mieszać "zwykłych" zmiennych ze zmiennymi *, ale nie mogę znaleźć nikogo, kto by to potwierdził lub zaprzeczył. Czytałem gdzieś (i nie mogę teraz znaleźć), że niektóre typy argumentów muszą być pierwsze, uważam argumenty za słowa kluczowe, które mogą, ale nie muszą być częścią mojego problemu.

+0

Szczegóły dokładnie, dlaczego to jest złe są nieco odmienne od Pythona 2.x oraz 3.x; patrz rozdział ma [Argumenty Złożone] (http://docs.python.org/2/tutorial/controlflow.html#keyword-arguments), a samym przekrojem odniesienia [definicje funkcji] (http://docs.python.org/ 2/reference/compound_stmts.html # function) dla odpowiedniej wersji zawiera szczegóły. Krótko mówiąc, nic nie może nadejść po parametrze "**". – abarnert

+0

Ja również dostałem [blogu] (http://stupidpythonideas.blogspot.com/2013/08/arguments-and-parameters.html), który wyjaśnia szczegóły; Nie wydaje mi się, żeby był przyjazny dla początkujących ... ale mam nadzieję, że jest to przynajmniej trochę łatwiejsze niż czytanie dokumentów referencyjnych. (Jest to Python 3-specyficzny, jednak.) – abarnert

Odpowiedz

13

Spróbuj tego:

def superfunction(k, *args, **kwargs): 

Zmienna parametr Hasło **kwargs musi być ostatnim elementem w deklaracji funkcji. Drugi do ostatniego, zmienny parametr pozycji *args. (Tylko w Pythonie 3.x, można również słowa kluczowe parametry tylko między *args i **kwargs.) Oraz w pierwszych miejsc, parametry pozycyjne - to poprawny sposób zadeklarować parametry funkcyjne. Aby uzyskać dodatkowe informacje, zapoznaj się z tym post.

Aby uzyskać pełne informacje, zobacz sekcję Definicje funkcji w dokumencie Python 3.x lub Python 2.x.

+1

więc jego nienazwanych Vars, nazwane Vars *, ** – jason

+0

Jedynym zamówienie mogę zmusić go do pracy w to superfunction def (k, n = 2, * args, ** kwargs): Dziękuję za skierowanie mnie na właściwą drogę. – jason

+0

nawiązanie: def superfunction (k, n = 2, * args, * args2, ** kwargs): Posiadanie wielu * argumenty typu generuje błąd składni zbyt. Chyba masz tylko jedną? – jason

4

Składnia powinna być tak:

def superfunction(k, *args, **kwargs): 

Najpierw trzeba podać wszystkie argumenty pozycyjne, następnie argumenty nie słów kluczowych, a następnie argumenty kluczowe.

+0

Oprócz uzyskania błędnych argumentów i parametrów ... argumenty i argumenty pozycyjne nie są takie same, więc jest to mylące i błędne. – abarnert

+0

Właściwa kolejność to: parametry pozycyjne lub słowa kluczowe, następnie opcjonalnie '* argumenty' (lub' * ', tylko w języku Python 3.x), następnie (tylko w języku Python 3.x) tylko słowa kluczowe, a następnie' * * kwargs'. – abarnert

+0

@ABarnert Ah! Czy to jest? Przeczytałem to kilka miesięcy temu, więc wydaje mi się, że zapomniałem terminu technicznego, a więc i pomyłki. Dziękuję za wskazanie tego. –

Powiązane problemy