TypeError: takes N positional arguments but M were given の原因と直し方
関数に定義されている数より多くの引数を渡したときに出るエラーです。
エラーメッセージの読み方
Traceback (most recent call last):
main.py- ファイル名
4- 行番号 — 実際にクラッシュした行
<module>- 発生場所 — <module> ならトップレベル、関数名ならその関数の中
TypeError- 例外クラス — 何が起きたか。ここを検索するのが最短です
add() takes 2 positional arguments but 3 were given- 詳細メッセージ — どの値が問題だったか
このエラーが出る典型パターン
パターン1
1 def add(a, b): 2 return a + b 3 4 print(add(1, 2, 3)) ^
Traceback (most recent call last):
File "main.py", line 4, in <module>
print(add(1, 2, 3))
^^^^^^^^^^^^
TypeError: add() takes 2 positional arguments but 3 were given
定義した引数の数より多く渡すとエラーになります。多い分の値を受け取る仕組み(*args)が無い限り、数はぴったり合わせる必要があります。
直し方: 1, 2, 3 を 1, 2 にします。
広告
広告スロット(未設定)
パターン2
1 def greet(name): 2 return "Hi " + name 3 4 print(greet("Tom", "Mr." )) ^
Traceback (most recent call last):
File "main.py", line 4, in <module>
print(greet("Tom", "Mr."))
^^^^^^^^^^^^^^^^^^^
TypeError: greet() takes 1 positional argument but 2 were given
敬称を追加で渡したくなっても、関数定義に対応する引数が無ければエラーになります。関数側にも引数を増やす必要があります。
直し方: "Tom", "Mr." を "Tom" にします。
パターン3
1 def square(x): 2 return x * x 3 4 print(square(2, 3 )) ^
Traceback (most recent call last):
File "main.py", line 4, in <module>
print(square(2, 3))
^^^^^^^^^^^^
TypeError: square() takes 1 positional argument but 2 were given
1つの値を2乗するだけの関数に、うっかり2つの値を渡すと発生します。
直し方: 2, 3 を 2 にします。
よくある誤解
多めに渡しても余った分は無視されると思われがちですが、Pythonは引数の数が合わないと即座にエラーにします。
まとめ
TypeError: takes N positional arguments but M were givenは中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。