ウェブや書籍でも見かける「**kwargs」という記述。
一言でいうと「引数の数が決まっていないときに使う」というものです。
この記事では「**kwargs」について具体的な例を使って説明します。
なお、「*args」についての解説記事は↓こちらです。
合わせてご覧ください。
理解できる対象者・レベル
この記事では、以下の方を想定して解説しています。
- 基本的なPythonの関数の定義が分かる
- 定義された関数を実行(呼び出す)ことができる
- 辞書(dict型)の使い方の基本が分かる
通常の関数の定義と呼び出し
まずは、一般的な関数の定義とその関数を呼び出す際の記述を確認しましょう。
def call(name):
print('こんにちは、' + name + 'さん')
上記では、callという関数を定義し、引数にnameとあります。
そのnameをprint文の中で使っています。
この関数を呼び出すとき、例えば以下の様に呼び出すと、
call('papa')
実行結果は「こんにちは、papaさん」となります。
このとき、call関数には’papa’という値が渡されるのですが、その’papa’はcall関数の引数(name)に入ります。
そのnameはprint文で使われているので、「こんにちは、papaさん」と出力されているのです。
この関数の基本が分かれば、この記事は理解できるでしょう。
もし関数について分からないという場合、こちらの記事を参考にしてください。
可変長の引数の使用方法
まずは、基本的な説明をスライドで確認しましょう。
記載の通り、kwargsという名前は慣例であり、本当はどんな文字でも構いません。
(クラスの定義でselfを使うのと同じ意味ですが、この説明が分からなければ忘れてください。
いくつかパターンを紹介しますが、まずは基本から。
可変長の引数の仕組みは、「キーワード引数で受け取る」ということです。
キーワード引数って何?という方はこちらの記事を参考にしてください。
それでは、順に説明していきます。
**kwargsを使った例題
この例題では、「申し込みフォーム」をイメージしてください。
そのフォームの項目は、
- 必須項目:「名前」と「性別」
- 任意項目:「年齢」と「オプション」
だとします。
名前と性別を受け取り、必要に応じて、年齢とオプションの情報も受け取り、それらをすべて辞書(dict型)で保管するという関数です。
以下の様に関数を定義し、実行(呼び出し)してみます。
def entry(name, gender, **kwargs): # 受け取る引数がいくつでも対応できる
# nameとgenderは辞書(dict型)に入れる
data = {'name': name, 'gender': gender}
# nameとgender以外は辞書(dict型)に追加する
data.update(kwargs)
print(data)
# 関数を呼び出す際、引数を渡す
entry(name='papa', gender='ひみつ', age=40, option='大盛り')
実行結果は「{‘name’: ‘papa’, ‘gender’: ‘ひみつ’, ‘age’: 40, ‘option’: ‘大盛り’}」となります。
つまり、変数dataの中に上記の値が「辞書(dict型)」で入っている状態です。
この例では、関数entryを呼び出すとき、引数が増えても減ってもうまく出力してくれます。
def entry(name, gender, **kwargs): # 受け取る引数がいくつでも対応できる
# nameとgenderは辞書(dict型)に入れる
data = {'name': name, 'gender': gender}
# nameとgender以外は辞書(dict型)に追加する
data.update(kwargs)
print(data)
# 関数を呼び出す際、引数を渡す
entry(name='papa', gender='ひみつ')
実行結果は「{‘name’: ‘papa’, ‘gender’: ‘ひみつ’}」となります。
先ほどとの違いは、関数に渡す引数がnameとgenderだけになり、ageとoptionはなくなりました。
しかし、ageとoptionは**kwargsなので、あってもなくても関係ありません。
なお、キーワード引数については、こちらの記事で説明しています。
興味がある方は是非ご覧ください。
以上で解説は終わりです。
「おー!便利だなぁ」と思ったら理解できたということですね。
まとめ
いかがだったでしょうか。
Pythonの可変長引数「**kwargs」について解説しました。
似たようなもので「*args」というものがありますが、この説明はこちらの記事で紹介します。
この記事に関する間違い、ご質問などがありましたら、コメントにてお知らせください。
それでは、ステキなPythonライフを!