LoginSignup
1
2

【Python】*argsとか**kwargsとかって何?

Last updated at Posted at 2023-07-14

はじめに

Kivyの公式文書を眺めていたときに、超基本的メソッドであるadd_widgetに書かれている*args**kwargsの意味が分からなかったので、調べたことをまとめました。
(Kivyが分からない方でも大丈夫です!今回は全く使いません)

目次

  • 環境のバージョン
  • Pythonでの*args**kwargs
  • 参考文献

環境のバージョン

  • macOS Ventura 13.4.1
  • Python 3.11.2

Pythonでの*args**kwargs

*argsについて

① 基礎の形

実際に簡単な例を紹介します。

example.py
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を使います。


②他の変数と一緒に使う

では、他にも代入したいものがあった場合はどうでしょう。

example.py
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 個に分けたよ

このように、最初にfruitnumberに必要な値は代入され、残りの右側の部分は丸ごと*argsに代入されます。
*argsがない場合でもエラーは出ず、空のタプルが代入されるようです。(正直0個には分けないで欲しかったんですけどね...)

ちなみに、*argsは一番後ろに書いた方が良さそうです。

一番後ろじゃないとこうなります。
example.py
# 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は代入したものが辞書型になります。

example.py
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に代入されます。

参考文献

Pythonの可変長引数(*args, **kwargs)の使い方 - note.nkmk.me

1
2
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2