【Python】Python ~ 可変長引数 / args, kwargs ~

■ はじめに

https://dk521123.hatenablog.com/entry/2023/10/31/000133
https://dk521123.hatenablog.com/entry/2020/05/19/000000

等ででてきた  *args, **kwargs について、
改めてちゃんと学ぶ

目次

【1】*args
【2】**kwargs
【3】使用上の注意
 1)指定する順番が大事
 2)kwargs 内のキーと同じ引数名にするとエラーになる

【1】*args

* args = arguments
* タプル版の可変長引数
* Python での読み方は「可変長位置引数」

【2】**kwargs

* kwargs(キーアーグス) = keyword arguments
* 辞書版(dict)の可変長引数
* Python での読み方は「可変長キーワード引数」

【3】使用上の注意

1)指定する順番が大事

* *args, **kwargs 両方使う場合、*args, **kwargs の順番で。
 => 逆だとエラーになる

OKケース

def demo(*args, **kwargs):
  print(args) # (1, 2)
  print(kwargs) # {'name': 'Mike'}

demo(1, 2, name="Mike")

NGケース

def demo(**kwargs, *args):
  print(args)
  print(kwargs)

demo(1, 2, name="Mike")

#    def demo(**kwargs, *args):
#                       ^
#SyntaxError: invalid syntax

2)kwargs 内のキーと同じ引数名にするとエラーになる

 以下「NGケース」を実行すると
例外「TypeError: 【メソッド名】() got multiple values for argument '【キー名】'」
が発生する

NGケース

def demo(name, age, **kwargs):
  print(name)
  print(age)
  print(kwargs)

kwargs = {"age": 12, "remarks": "Hello"}
demo("Mike", 12, **kwargs)

エラー内容

Traceback (most recent call last):
  File "c:\python\demo.py", line 7, in <module>
    demo("Mike", 12, **kwargs)
TypeError: demo() got multiple values for argument 'age'

原因

kwargs 内のキーと同じ引数名のため
メソッド内で引数を展開する際に、同じ変数名となりエラーになる

# イメージ(同じ age のためエラーになる)
def demo(name, age, age, remarks):

解決案(OKケース)

# 例1:引数の変数名を被らないように変更
def demo(name, member_age, **kwargs):
  print(name) # Mike
  print(member_age) # 12
  print(kwargs) # {'age': 12, 'remarks': 'Hello'}

kwargs = {"age": 12, "remarks": "Hello"}
demo("Mike", 12, **kwargs)

参考文献

https://qiita.com/ys_dirard/items/6009405b93c5c6ad335d

関連記事

Python ~ 基本編 / 文字列 ~
https://dk521123.hatenablog.com/entry/2019/10/12/075251
Python ~ デコレータ @xxxx ~
https://dk521123.hatenablog.com/entry/2020/05/19/000000
Python ~ 基本編 / 日付・日時あれこれ ~
https://dk521123.hatenablog.com/entry/2022/02/01/000000
Python ~ 基本編 / 正規表現
https://dk521123.hatenablog.com/entry/2019/09/01/000000
Python ~ 基本編 / 正規表現あれこれ ~
https://dk521123.hatenablog.com/entry/2020/10/15/000000
Python ~ 基本編 / コメント文 ~
https://dk521123.hatenablog.com/entry/2019/10/23/212149
Python ~ 基本編 / JSON
https://dk521123.hatenablog.com/entry/2019/10/19/104805
Python ~ 基本編 / JSONあれこれ ~
https://dk521123.hatenablog.com/entry/2022/02/14/000000