はじめに
Kivyの公式文書を眺めていたときに、超基本的メソッドであるadd_widget
に書かれている*args
や**kwargs
の意味が分からなかったので、調べたことをまとめました。
(Kivyが分からない方でも大丈夫です!今回は全く使いません)
目次
- 環境のバージョン
- Pythonでの
*args
と**kwargs
- 参考文献
環境のバージョン
- macOS Ventura 13.4.1
- Python 3.11.2
Pythonでの*args
と**kwargs
*args
について
① 基礎の形
実際に簡単な例を紹介します。
def cal_sum(*args):
return sum(args)
def cal_sum_type(*args):
return type(args)
sum_a = cal_sum(1, 2, 3, 4, 5)
sum_b = cal_sum(10, 20, 30, 40)
type_a = cal_sum_type(1, 2, 3, 4, 5)
print('a =', sum_a)
print('b =', sum_b)
print('a is', type_a)
結果
a = 15
b = 100
a is <class 'tuple'>
これを見るに、どうやら関数に代入した値を、丸ごとタプルとして扱えるようです。
ちなみに、関数内では*args
ではなくargs
を使います。
②他の変数と一緒に使う
では、他にも代入したいものがあった場合はどうでしょう。
def fruit_div(fruit, number, *args):
print('----------')
print('*args =', args)
print(number, '個の', fruit, 'を', sum(args), '個に分けたよ')
fruit_div('りんご', 1, 2, 3, 4, 5)
fruit_div('ぶどう', 10, 20, 30, 40)
fruit_div('もも', 1)
結果
----------
*args = (2, 3, 4, 5)
1 個の りんご を 14 個に分けたよ
----------
*args = (20, 30, 40)
10 個の ぶどう を 90 個に分けたよ
----------
*args = ()
1 個の もも を 0 個に分けたよ
このように、最初にfruit
、number
に必要な値は代入され、残りの右側の部分は丸ごと*args
に代入されます。
*args
がない場合でもエラーは出ず、空のタプルが代入されるようです。(正直0個には分けないで欲しかったんですけどね...)
ちなみに、*args
は一番後ろに書いた方が良さそうです。
一番後ろじゃないとこうなります。
# numberと*argsを逆にしただけ
def fruit_div(fruit, *args, number):
print('----------')
print('*args =', args)
print(number, '個の', fruit, 'を', sum(args), '個に分けたよ')
fruit_div('りんご', 1, 2, 3, 4, 5)
結果
TypeError: fruit_div() missing 1 required keyword-only argument: 'number'
「number
がないぞ!」って怒られちゃいました。後ろの引数全てを*args
に代入してしまったようです。エラーが起きない方法もありますが、ここでは解説しません。
**kwargs
について
基本は*args
と一緒ですが、**kwargs
は代入したものが辞書型になります。
def dic_age_dog(**kwargs):
print('----------')
print('*kwargs =', kwargs)
print(type(kwargs))
def dic_age(kind, **kwargs):
print('----------')
print('kind =', kind)
print('*kwargs =', kwargs)
dic_age_dog(pochi=1, hana=2, kuro=3, buchi=4)
dic_age('animal', hamu=1, tori=2, neko=3, inu=4)
結果
----------
*kwargs = {'pochi': 1, 'hana': 2, 'kuro': 3, 'buchi': 4}
<class 'dict'>
----------
kind = animal
*kwargs = {'hamu': 1, 'tori': 2, 'neko': 3, 'inu': 4}
*args
のときと同様、残りの右側の部分は丸ごと**kwargs
に代入されます。