Code Fix

中級

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, 31, 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, 32 にします。

この問題を解いてみる →

よくある誤解

多めに渡しても余った分は無視されると思われがちですが、Pythonは引数の数が合わないと即座にエラーにします。

まとめ

TypeError: takes N positional arguments but M were givenは中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)