本記事では、TypeError: 関数名() got multiple values for argument '引数'のエラー原因と解決方法を紹介します。
原因
関数の引数に複数の値を渡しているため発生しているエラーです。
よくあるケースが以下の通りです。
よくある原因
- 位置引数とキーワード引数の混同により、一つの引数に複数の値を受け渡すケース
-
クラス内関数の
self
の付け忘れ
解決方法
具体的な実装を用いて解決方法を確認していきます。
下記では正常に動作するfunc関数と、selfを付け忘れ正常に動作しないerror_funcを持つTempクラスを定義しています。
位置引数とキーワード引数の混同
まず、関数の呼び出し方が原因で発生する表題のエラーを再現します。
上記のエラー発生例では、func関数の引数a
に対して
位置引数でa
に1
が渡されているにもかかわらず、キーワード引数でもa
に2
が渡されるため上記エラーが発生します。
解決方法としては、単純ですが、想定する引数に値が渡せているか確認する再確認が必要です。
安全な対処としては、すべてキーワード引数で値を渡すことでミスを減らすことができます。
クラス内関数のself
の付け忘れ
こちらは値の渡し方によってエラーが変わるため、気付きにくくハマる可能性のある実装ミスです。
まず、エラーを再現します。
上記エラーはすべてself
の付け忘れに起因するものです。
コメントにエラー内容を記載していますが、引数の指定方法によりエラー内容が異なっています。
クラス内関数を呼び出す場合、暗黙的に位置引数の1番目にself
に該当するオブジェクトを渡そうとします。
このため、1つの目のエラーでは、引数a
にTemp
オブジェクトを渡すこととなり、Temp
オブジェクトとb
の乗算となりエラーが発生します。
2つ目のエラーでは、暗黙的にself
を追加した計3つの引数がerror_func
に渡されることによりエラーが発生します。
最後に、3つ目4つ目のエラーでは、位置引数の1番目でa
にself
オブジェクトが渡されているにも関わらず、キーワード引数で再度a
に2
を渡そうとしているため表題のエラーが発生しています。
解決方法は、クラス内関数にself
を指定することです。
確認項目
- 位置引数とキーワード引数など想定通りの値を渡しているか?
-
クラス内関数に
self
は付いているか?
0 件のコメント :
コメントを投稿