Dlaczego ten fragment kodu generuje błąd SyntaxError?
>>> def fun1(a="who is you", b="True", x, y):
... print a,b,x,y
...
File "<stdin>", line 1
SyntaxError: non-default argument follows default argument
Podczas gdy następujący fragment kodu działa bez widocznych błędów:
>>> def fun1(x, y, a="who is you", b="True"):
... print a,b,x,y
...
def myfunction(position_arguments, *arguments, **keywords):
`....`Odpowiedzi:
Wszystkie wymagane parametry należy umieścić przed wszelkimi domyślnymi argumentami. Po prostu dlatego, że są obowiązkowe, podczas gdy domyślne argumenty nie. Składniowo interpretator nie byłby w stanie zdecydować, które wartości pasują do których argumentów, gdyby tryby mieszane były dozwolone. A
SyntaxError
jest podnoszone, jeśli argumenty nie są podane we właściwej kolejności:Przyjrzyjmy się argumentom słów kluczowych, używając Twojej funkcji.
Załóżmy, że można zadeklarować funkcję jak powyżej.Następnie za pomocą powyższych deklaracji możemy wykonać następujące (zwykłe) wywołania argumentów pozycyjnych lub słów kluczowych:
Jak zasugerujesz przypisanie zmiennych w wywołaniu funkcji, jak będą używane domyślne argumenty wraz z argumentami słów kluczowych.
Odniesienie O'Reilly - Core-Python
Gdzie ta funkcja wykorzystuje domyślne argumenty poprawne składniowo dla powyższych wywołań funkcji. Wywoływanie argumentów słów kluczowych okazuje się przydatne, ponieważ umożliwia dostarczenie argumentów pozycyjnych spoza kolejności, ale w połączeniu z argumentami domyślnymi można ich również używać do „przeskakiwania” brakujących argumentów.
źródło
func1(x=1, y=2)
.**kwargs
nie mogę wykonaćdef fun1(a="who is you", b="True", x, y)
ani podobnej pracy. Jeśli używaszdef f(**kwargs)
, musisz obsługiwać domyślne wartości w treści?def fun1(a="who is you", b="True", x, y)
to samo można osiągnąć, stosując inny styl. if def fun1 (** kwrgs) `wtedy wywołaniefun1({'a': 'who is you', 'b': True})
nie ma potrzeby przekazywania x i y.def foo(x=None, y)
był dozwolony. Więc nadal jestem ciekawy, dlaczego Python nie pozwala na to. Czy istnieje prawdziwy fundamentalny powód, czy jest to po prostu „nie pozwalamy na to, ponieważ na to nie pozwalamy”.Jeśli pozwolisz na to, domyślne argumenty staną się bezużyteczne, ponieważ nigdy nie będziesz w stanie użyć ich wartości domyślnych, ponieważ argumenty inne niż domyślne pojawiają się po .
Jednak w Pythonie 3 możesz wykonać następujące czynności:
co sprawia, że
x
iy
słowo kluczowe tylko po to, abyś mógł to zrobić:To działa, ponieważ nie ma już żadnej dwuznaczności. Zauważ, że nadal nie możesz tego zrobić
fun1(2, 2)
(to ustawiłoby domyślne argumenty).źródło
Pozwólcie, że wyjaśnię tutaj dwie kwestie:
def example(a, b, c=None, r="w" , d=[], *ae, **ab):
(a, b) są parametrami pozycyjnymi
(c = none) jest parametrem opcjonalnym
(r = "w") to parametr słowa kluczowego
(d = []) to parametr listy
(* ae) dotyczy tylko słów kluczowych
(** ab) jest parametrem słowa kluczowego var
def example(a, b, c=a,d=b):
argument nie jest zdefiniowany podczas zapisywania wartości domyślnych, Python oblicza i zapisuje wartości domyślne podczas definiowania funkcji
c i d nie są zdefiniowane, nie istnieje, gdy tak się dzieje (istnieje tylko wtedy, gdy funkcja jest wykonywana)
„a, a = b” nie jest dozwolone w parametrze.
źródło
Wymagane argumenty (te bez wartości domyślnych) muszą znajdować się na początku, aby kod klienta mógł dostarczyć tylko dwa. Gdyby opcjonalne argumenty znajdowały się na początku, byłoby mylące:
Co by to zrobiło w twoim pierwszym przykładzie? W ostatnim przypadku x to „kto jest kim”, y to 3, a a = „walet”.
źródło