2016/06/24更新

[Python] **を用いたキーワード引数の辞書化

このエントリーをはてなブックマークに追加      

こんにちは、@yoheiMuneです。
本日は先日の[Python] *を用いて位置引数をタプル化するに引き続き、**を用いたキーワード引数の辞書化についてブログを書きたいと思います。

画像

目次




**を用いたキーワード引数の辞書化とは

Python独特な記法の一つで、関数の引数を**kwargsのようにアスタリスクを2つ使って定義することができます。
# **によるキーワード引数の辞書化
def print_kwargs(**kwargs):
    print("Keyword arguments:", kwargs)
このように定義することで、以下のように任意のキーワード引数を指定することができるようになります。
# 引数を指定しない場合
print_kwargs()
# Keyword arguments: {}

# キーワード引数を2つ指定した場合
print_kwargs(num=1, text="aaa")
# Keyword arguments: {'num': 1, 'text': 'aaa'}
とても便利ですね!これは様々なライブラリで使われていて、例えばFlaskライブラリのテンプレート部分で使われていたりします。

なお、この機能はキーワード引数(Keyword arguments)に関する機能なので、以下のように位置引数を指定した場合はエラーになります。
# 位置引数を指定したらエラー
print_kwargs(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: print_kwargs() takes 0 positional arguments but 1 was given



*argsとの併用

この機能は、先日紹介した*argsと併用して使うことができます。ただし注意点として、「*args -> **kwargs」の順で必ず指定する必要があります。
# *argsと**kwargsとの併用
def print_args(*args, **kwargs):
    print("Positional arguments:", args)
    print("Keyword arguments:", kwargs)
以下のように呼び出すことができます。
# 引数を指定しない場合
print_args()
# Positional arguments: ()
# Keyword arguments: {}

# 位置引数のみ指定した場合
print_args(1,2,3)
# Positional arguments: (1, 2, 3)
# Keyword arguments: {}

# キーワード引数のみ指定した場合
print_args(name="Yohei", age=30)
# Positional arguments: ()
# Keyword arguments: {'name': 'Yohei', 'age': 30}

# 位置引数とキーワード引数を共に指定した場合
print_args(1, 2, 3, name="Yohei", age=30)
# Positional arguments: (1, 2, 3)
# Keyword arguments: {'name': 'Yohei', 'age': 30}
標準ライブラリなどではこの併用が使われているものもあり、引数なんでも受け取れまっせ、みたいな状態になっているものがあります。



引数を辞書(dictionary)で渡す

今までは関数の引数での話でしたが、似たように引数を辞書型で渡すことで、キーワード引数を指定することができます。
# 引数が2つの関数
def say_hello(name, age):
    print("Hi, my name is %s, %d years old" % (name, age))

# 位置引数で指定できますし、
say_hello("Yohei", 30)
# Hi, my name is Yohei, 30 years old

# キーワード引数でも指定できますし、
say_hello(name="Yohei", age=30)
# Hi, my name is Yohei, 30 years old

# そしてなんと、辞書でも指定できます。
user = {"name": "Yohei", "age": 30}
say_hello(**user)
# Hi, my name is Yohei, 30 years old
ここでは引数で渡す時の**userがポイントです。このようにすることで、辞書形式で関数に引数を渡すことができます。



参考資料

Pythonの基礎勉強は、以下の書籍を熟読して猛威勉強中です。色々と掲載されていて非常に参考になります。

『入門 Python 3(O'Reilly)』



最後に

今日は、**kwargsを用いた引数の辞書化をブログに書きました。Python特有な感じですが、慣れると使いやすいものなので是非使えるようになりたいところです(ライブラリを書くときとかは必須の知識になりそうです)。今後もPythonについては、学習がてらいろいろとブログを書けたらと思います。

最後になりますが本ブログでは、Python・Swift・Java・フロントエンド・機械学習など雑多に情報発信をしていきます。自分の第2の脳にすべく、情報をブログに貯めています。気になった方は、本ブログのRSSTwitterをフォローして頂けると幸いです ^ ^。

最後までご覧頂きましてありがとうございました!





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。