Python学習チャンネル by PyQ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

「PythonのTypeError: xxx takes 1 positional argument but 2 were given」が出る原因は?

f:id:kenken0326:20210826151858p:plain

こんにちはPyQサポートです。

今回はTypeError: xxx takes 1 positional argument but 2 were givenというエラーの意味と考えられる原因を紹介します。

質問:「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

文字列と数値を結合しようとするときに発生するエラーです。

blog.pyq.jp

TypeError: 'int' object is not iterable

繰り返し(for文)に使えないオブジェクトを繰り返し処理で使っているときに発生するエラーです。 for文のinの中に繰り返すことのできない値を入れると表示されます。

blog.pyq.jp

TypeError: unhashable type: 'set'

ハッシュ可能でない「集合」「リスト」「辞書」を辞書のキーにしようとしている時に発生するエラーです。

blog.pyq.jp

Copyright ©2017- BeProud Inc. All rights reserved.