f(a, b, option1=10, option2=20)
のように引数をキーワードで指定でしたいという基本的なことについて。オプションは毎回指定するものではなくて、指定しなければデフォルト値が使われるようにしたい。
f(a, b) # option1, option2 は指定しなくてもいい
**kwargs
検索すると **kwargs
というものがよくでてくる。
def f(a, b, **kwargs):
option1 = kwargs.get('option1', 1)
option2 = kwargs.get('option2', 2)
kwargs
はキーワード名と値の入った辞書で、get
メソッドでデフォルトの値を指定している。
しかし、**kwargs
は「なんでもあり」なので、うっかりスペルミスすると意図しないデフォルト値が使われる。
f(a, b, opton1=10) # スペルミスにより option1 はデフォルトの1となる
デフォルト引数
そもそも、Python では引数を名前でよべるので、キーワードが決まっているなら **kwargs
を使うべきではない。
def f(a, b, option1=1, option2=2):
pass
f(a, b, option1=10, option2=20)
f(a, b, opton1=10) # エラー opton1というキーワードはない
しかし、option1
は固定引数でもあるので、うっかり引数の数を間違えると option を上書きしてしまう。
f(a, b, c) # 引数の数を間違え、意図しない option1=c
*
引数 (Python3)
Python3 では *
をはさむことで以降の変数はキーワードでしか呼べなくなる。
def f(a, b, *, option1=1, option2=2):
pass
f(a, b, option1=10, option2=20)
f(a, b, c) # エラー 固定変数は2つ
f(a, b, opton1=10) # エラー 存在しないキーワード
というわけで、Python3 ではこれがおすすめ。
参考