[Python] TypeError: 関数名() got multiple values for argument '引数'の原因と対処法

2022年7月8日金曜日

Python

本記事では、TypeError: 関数名() got multiple values for argument '引数'のエラー原因と解決方法を紹介します。

アイキャッチ

原因

関数の引数に複数の値を渡しているため発生しているエラーです。
よくあるケースが以下の通りです。

よくある原因

  1. 位置引数とキーワード引数の混同により、一つの引数に複数の値を受け渡すケース
  2. クラス内関数のselfの付け忘れ

解決方法

具体的な実装を用いて解決方法を確認していきます。

下記では正常に動作するfunc関数と、selfを付け忘れ正常に動作しないerror_funcを持つTempクラスを定義しています。

class Temp:
  def func(self, a, b=5):
    return a*b
  def error_func(a, b=5):
    return a*b

位置引数とキーワード引数の混同

まず、関数の呼び出し方が原因で発生する表題のエラーを再現します。

temp = Temp()
# 正常な呼び出し
print(temp.func(2)) # 10
print(temp.func(2, 4)) # 8
# エラー
temp.func(1, a=2) # TypeError: func() got multiple values for argument 'a'

上記のエラー発生例では、func関数の引数aに対して 位置引数でa1が渡されているにもかかわらず、キーワード引数でもa2が渡されるため上記エラーが発生します。

解決方法としては、単純ですが、想定する引数に値が渡せているか確認する再確認が必要です。
安全な対処としては、すべてキーワード引数で値を渡すことでミスを減らすことができます。

クラス内関数のselfの付け忘れ

こちらは値の渡し方によってエラーが変わるため、気付きにくくハマる可能性のある実装ミスです。
まず、エラーを再現します。

temp.error_func(2) # TypeError: unsupported operand type(s) for *: 'Temp' and 'int'
temp.error_func(2,4) # TypeError: error_func() takes from 1 to 2 positional arguments but 3 were given
temp.error_func(a=2) # TypeError: error_func() got multiple values for argument 'a'
temp.error_func(a=2, b=4) # TypeError: error_func() got multiple values for argument 'a'

上記エラーはすべてselfの付け忘れに起因するものです。

コメントにエラー内容を記載していますが、引数の指定方法によりエラー内容が異なっています。 クラス内関数を呼び出す場合、暗黙的に位置引数の1番目にselfに該当するオブジェクトを渡そうとします。

このため、1つの目のエラーでは、引数aTempオブジェクトを渡すこととなり、Tempオブジェクトとbの乗算となりエラーが発生します。

2つ目のエラーでは、暗黙的にselfを追加した計3つの引数がerror_funcに渡されることによりエラーが発生します。

最後に、3つ目4つ目のエラーでは、位置引数の1番目でaselfオブジェクトが渡されているにも関わらず、キーワード引数で再度a2を渡そうとしているため表題のエラーが発生しています。

解決方法は、クラス内関数にselfを指定することです。

確認項目

  1. 位置引数とキーワード引数など想定通りの値を渡しているか?
  2. クラス内関数にselfは付いているか?

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology