77
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

Python 関数のキーワード引数

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 ではこれがおすすめ。

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
77
Help us understand the problem. What are the problem?