Code Fix

中級

必要な引数を渡していないエラーの原因と直し方

関数定義で必要な引数の数だけ、呼び出し時に値を渡していないときに出るエラーです。

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

Traceback (most recent call last):
main.py
ファイル名
4
行番号 — 実際にクラッシュした行
<module>
発生場所 — <module> ならトップレベル、関数名ならその関数の中
TypeError
例外クラス — 何が起きたか。ここを検索するのが最短です
add() missing 1 required positional argument: 'b'
詳細メッセージ — どの値が問題だったか

このエラーが出る典型パターン

パターン1

 1  def add(a, b):
 2      return a + b
 3  
 4  print(add(3      ))
                 ^
Traceback (most recent call last): File "main.py", line 4, in <module> print(add(3)) ^^^^^^ TypeError: add() missing 1 required positional argument: 'b'

定義した引数の数だけ、呼び出し時にも値を渡す必要があります。1つでも足りないとTypeErrorになります。

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

この問題を解いてみる →

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

パターン2

 1  def greet(name, greeting):
 2      return greeting + ", " + name
 3  
 4  print(greet("Tom"              ))
                         ^
Traceback (most recent call last): File "main.py", line 4, in <module> print(greet("Tom")) ^^^^^^^^^^^^ TypeError: greet() missing 1 required positional argument: 'greeting'

第2引数を渡し忘れると、名前だけでは挨拶文を組み立てられません。

直し方: "Tom" を "Tom", "Hello" にします。

この問題を解いてみる →

パターン3

 1  def area(width, height):
 2      return width * height
 3  
 4  print(area(5      ))
                  ^
Traceback (most recent call last): File "main.py", line 4, in <module> print(area(5)) ^^^^^^^ TypeError: area() missing 1 required positional argument: 'height'

面積の計算には縦横2つの値が要ります。片方だけでは計算できないため呼び出し時点でエラーになります。

直し方: 5 を 5, 3 にします。

この問題を解いてみる →

パターン4

 1  def volume(l, w, h):
 2      return l * w * h
 3  
 4  print(volume(2, 3      ))
                      ^
Traceback (most recent call last): File "main.py", line 4, in <module> print(volume(2, 3)) ^^^^^^^^^^^^ TypeError: volume() missing 1 required positional argument: 'h'

3つの引数のうち1つでも足りないとエラーになります。体積の計算には縦・横・高さの3つがすべて必要です。

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

この問題を解いてみる →

パターン5

 1  def full_name(first, middle, last):
 2      return first + " " + middle + " " + last
 3  
 4  print(full_name("John"               ))
                              ^
Traceback (most recent call last): File "main.py", line 4, in <module> print(full_name("John")) ^^^^^^^^^^^^^^^^^ TypeError: full_name() missing 2 required positional arguments: 'middle' and 'last'

2つ以上の引数が同時に足りないと、メッセージは複数形になり不足している引数名が両方とも列挙されます。

直し方: "John" を "John", "Q", "Public" にします。

この問題を解いてみる →

よくある誤解

デフォルト値の無い引数は、呼び出し時に必ず値を渡す必要があります。「無くても動くはず」という思い込みが原因になりやすいポイントです。

実務での勘所

引数の数が合わないエラーを未然に防ぐ設計として、デフォルト値(def greet(name, greeting="こんにちは"):)を設定する方法のほかに、Python 3特有のキーワード専用引数という書き方があります。def greet(name, *, greeting):のようにアスタリスクを挟むと、それ以降の引数は呼び出し時に必ずgreeting="..."のようにキーワードを明示しなければならなくなり、引数の順番や数を数え間違えるミス自体が起こりにくくなります。

演習をはじめる

関連するエラー

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