■ はじめに
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