pythonのキーワード引数と辞書形式(**dict)の利用について
pythonで関数を呼び出すときに、引数にparameter(仮引数)の名前を指定してする方法があります。3行目のようにparameterが3つあるとして、3つの引数の値を数が合うように順番に呼び出す方法を位置引数といいます。これに対して、4行目のように引数名を指定する方法をキーワード引数といいます。さらに、5行目のように引数名と引数の値を辞書形式(doct)にして関数に渡す方法もあります。このとき、辞書では引数名は''()をつけ、呼び出すときにdictに**を付けるようにします。このことにより関数側では辞書が展開され、通常のキーワード引数と同じよう処理することができます。
def func_unpack_kwarg(parm_1, parm_2, parm_3): # parameter:仮引数
return f'parm_1={parm_1}、parm_2={parm_2}、parm_3={parm_3}'
print(func_unpack_kwarg(1, 2, 3))
print(func_unpack_kwarg(parm_1=1, parm_2=2, parm_3=3))
dict = {'parm_1':1, 'parm_2':2, 'parm_3':3}
print(func_unpack_kwarg(**dict))
# parm_1=1、parm_2=2、parm_3=3
# parm_1=1、parm_2=2、parm_3=3
# parm_1=1、parm_2=2、parm_3=3
位置引数であれば、値を順番に並べればよいのに対し、キーワード引数はいちいち引数名を指定する必要がるのですが、次のようにparameterがたくさんあり、これらにつてい初期値(default)が定められていて、たまに初期値でない値を渡す必要がある場合などは、parm_1,parm_2は位置引数で初期値を与える必要があるなどカンマの数を数えるのは大変です。このような場合は、キーワード引数を使う方がどの引数にどの値を入れるかが明確になります。なおかつ、順番も前後が入れ替わっても問題ないので、プログラムがスッキリとします。
なお、kwargsはkey word argumentsの略で、カタカナにすると"クワーグス"と発音するのが一般的なようです。
def func_default_kwarg(parm_1=1, parm_2=2, parm_3=3, parm_4=4, parm_5=5): # parameter:仮引数
return f'parm_1={parm_1}、parm_2={parm_2}、parm_3={parm_3}、parm_4={parm_4}、parm_5={parm_5}'
print(func_default_kwarg( 1,2, 33, 44))
print(func_default_kwarg(parm_4=44, parm_3=33))
dict = {'parm_4':44, 'parm_3':33}
print(func_default_kwarg(**dict))
# parm_1=1、parm_2=2、parm_3=33、parm_4=44、parm_5=5
# parm_1=1、parm_2=2、parm_3=33、parm_4=44、parm_5=5
# parm_1=1、parm_2=2、parm_3=33、parm_4=44、parm_5=5
キーワード引数ではpackする使い方も想定されます。
def func_pack_kwarg(**kwargs): # parameter:仮引数
print(kwargs)
for key, value in kwargs.items():
print(key, value)
print('-----------------------------------------')
func_pack_kwarg(parm_1=1)
func_pack_kwarg(parm_1 = 1,parm_2 = 2, parm_3 = 3)
dict = {'parm_1': 1, 'parm_2': 2, 'parm_3': 3}
func_pack_kwarg(**dict)
# {'parm_1': 1}
# parm_1 1
-----------------------------------------
# {'parm_1': 1, 'parm_2': 2, 'parm_3': 3}
# parm_1 1
# parm_2 2
# parm_3 3
-----------------------------------------
# {'parm_1': 1, 'parm_2': 2, 'parm_3': 3}
# parm_1 1
# parm_2 2
# parm_3 3
-----------------------------------------
関数側で**付きでparameterを指定して、main側でキーワードを指定して呼び出すと、指定した引数が関数側では辞書形式になり、3行目にようにして取り出すことができます。
これだけの情報で、dict恐怖症が解消できるかはわかりませんが、少しはわかりやすくなればと思います。