こんにちはPyQサポートです。
今回はTypeError: xxx takes 1 positional argument but 2 were given
というエラーの意味と考えられる原因を紹介します。
- 質問:「TypeError: xxx takes 1 positional argument but 2 were given」はどんなエラーですか?
- 回答:「引数の数が違う」というエラーです
- その他のTypeErrorの紹介
質問:「TypeError: xxx takes 1 positional argument but 2 were given」はどんなエラーですか?
TypeError: print_name() takes 1 positional argument but 2 were given
というエラーが出ました。 このエラーが出る原因を教えてください。
入力したコード(py1.py)
class A: def print_name(name): print(name) a = A() a.print_name("James")
実行したコマンド
python py1.py
出たエラー(実行結果)
Traceback (most recent call last): File "py1.py", line 7, in <module> a.print_name("James") TypeError: print_name() takes 1 positional argument but 2 were given
回答:「引数の数が違う」というエラーです
これは、引数の数が違うというエラーです。
a.print_name("James")
を実行すると、Pythonのコードを解釈して実行するプログラムでは、A.print_name(a, "James")
と読み替えます。
つまり、オブジェクト.メソッド(引数)
は、クラス.メソッド(オブジェクト, 引数)
と読み替えられます。
ここで、クラス.メソッド
は、下記のA.print_name
です。
class A: def print_name(name): print(name)
前述のとおり、a.print_name("James")
を実行すると、A.print_name(a, "James")
が実行されます。
print_name()
メソッドの呼び出し時には2つの引数(a
と"James"
)が渡されているのに、上記のprint_name()
メソッドの定義には引数が1つ(name
)しかありません。
このように 定義した引数よりも渡した引数のほうが多い ため、引数の数が違う(TypeError: print_name() takes 1 positional argument but 2 were given
)というメッセージが表示されます。
このエラーを修正するには、第1引数にself
を追加します。self
は、慣習的に使われるオブジェクト自身を表す変数名です。
この修正により実行できます。
class A: def print_name(self, name): print(name)
なお、TypeError: xxx takes 1 positional argument but 2 were given
は、定義された引数の数より渡された引数の数が多い場合に発生するエラーです。
そのため、メソッドに限った話ではなく、関数でもこのエラーは発生します。
ただ今回の例のように、エラー発生の原因が「メソッド定義時のself
忘れ」の場合、初学者のうちは原因がわかりにくいかもしれません。
メソッド定義時は引数self
を忘れていないか、よく注意しましょう。
TypeError: xxx takes 1 positional argument but 2 were givenが出る時にチェックするといい、よくあるミス
- メソッド定義の第1引数を
self
にしているか
その他のTypeErrorの紹介
TypeError: must be str, not int
文字列と数値を結合しようとするときに発生するエラーです。
TypeError: 'int' object is not iterable
繰り返し(for文)に使えないオブジェクトを繰り返し処理で使っているときに発生するエラーです。 for文のinの中に繰り返すことのできない値を入れると表示されます。
TypeError: unhashable type: 'set'
ハッシュ可能でない「集合」「リスト」「辞書」を辞書のキーにしようとしている時に発生するエラーです。