Code Fix

中級

定義より多い引数を渡したエラーの原因と直し方

関数に定義されている数より多くの引数を渡したときに出るエラーです。

エラーメッセージの読み方

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

この問題を解いてみる →

パターン4

 1  def say_hi():
 2      return "Hi"
 3  
 4  print(say_hi("Tom"))
                   ^
Traceback (most recent call last): File "main.py", line 4, in <module> print(say_hi("Tom")) ^^^^^^^^^^^^^ TypeError: say_hi() takes 0 positional arguments but 1 was given

引数を1つも取らない関数に何か渡すと、既定の引数の数(0個)を超えたとしてエラーになります。

直し方: "Tom" を (空) にします。

この問題を解いてみる →

パターン5

 1  def power(base, exp):
 2      return base ** exp
 3  
 4  print(power(2, 3, 4))
                   ^
Traceback (most recent call last): File "main.py", line 4, in <module> print(power(2, 3, 4)) ^^^^^^^^^^^^^^ TypeError: power() takes 2 positional arguments but 3 were given

べき乗の計算に必要なのは底と指数の2つだけです。3つ目を渡すとエラーになります。

直し方: 2, 3, 4 を 2, 3 にします。

この問題を解いてみる →

よくある誤解

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

実務での勘所

呼び出し側でリストの前に*を付けて展開する(f(*mylist))と、リストの要素それぞれが個別の引数として渡されます。1つの引数としてリストそのものを渡したいだけなのに誤って*を付けてしまうと、要素数の分だけ引数を渡したことになり、このエラーが起きます。逆に、本当に個数が可変の引数を受け取りたい場合は、関数定義側で*argsを使えば、いくつ渡されても1つのタプルとしてまとめて受け取れるため、そもそもこのエラーの対象外になります。

演習をはじめる

関連するエラー

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