1. ホーム
  2. python

[解決済み] なぜ非デフォルトの引数はデフォルトの引数に従えないのか?

2022-04-24 02:34:48

質問

なぜこのコード片は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

一方、次のコード片は目に見えるエラーなしに実行されます。

>>> def fun1(x, y, a="who is you", b="True"):
...     print a,b,x,y
... 

解決方法は?

すべての必須パラメータは、デフォルト引数の前に置かなければなりません。なぜなら、それらは必須であるのに対し、デフォルトの引数はそうではないからです。構文的には、次のようになります。 不可能 もし混合モードが許されるなら、インタープリタはどの値がどの引数に一致するかを決定することができます。A SyntaxError は、引数が正しい順序で与えられていない場合に発生します。

この関数を用いて、キーワード引数を見てみましょう。

def fun1(a="who is you", b="True", x, y):
...     print a,b,x,y

上記のように関数を宣言することが許されるとします。 そして、上記の宣言で、次のような(通常の)位置引数やキーワード引数の呼び出しを行うことができます。

func1("ok a", "ok b", 1)  # Is 1 assigned to x or ?
func1(1)                  # Is 1 assigned to a or ?
func1(1, 2)               # ?

関数呼び出しにおける変数の割り当てをどのように提案するか、デフォルトの引数をキーワード引数とともにどのように使用するか。

>>> def fun1(x, y, a="who is you", b="True"):
...     print a,b,x,y
... 

参考文献 O'Reilly - Core-Python

この関数は、上記の関数呼び出しに対して、構文的に正しいデフォルトの引数を使用します。 キーワード引数の呼び出しは、順番が正しくない位置の引数を提供することができるため便利ですが、デフォルト引数と組み合わせることで、足りない引数をスキップするために使用することもできます。