Python

Python 関数のキーワード引数

More than 1 year has passed since last update.
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 ではこれがおすすめ。

参考

http://stackoverflow.com/questions/1419046/python-normal-arguments-vs-keyword-arguments