Pythonの「missing X required positional argument」エラーの原因と解決方法

Pythonで関数やメソッドを呼び出したときに、

TypeError: missing X required positional argument: 'xxx'

というエラーが表示されることがあります。

これは、関数が必要としている引数を指定せずに呼び出したときに発生する代表的なPythonエラーです。

本記事では、「missing X required positional argument」の意味から、具体的な原因、解決方法、よくある間違い、引数を省略してもエラーにしない方法まで、初心者向けにわかりやすく解説します。


「missing X required positional argument」とは?

「missing X required positional argument」は、PythonのTypeErrorの一種です。

例えば、次のコードを実行します。

def greet(name):
    print(f"こんにちは、{name}さん")

greet()

実行すると、次のようなエラーになります。

TypeError: greet() missing 1 required positional argument: 'name'

これは、

greet()を呼び出すにはnameという引数が1個必要なのに、指定されていません

という意味です。

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

TypeError: greet() missing 1 required positional argument: 'name'

それぞれの意味は次の通りです。

表示 意味
TypeError 引数の指定方法など、型・操作に関するエラー
greet() エラーが発生した関数
missing 不足している
1 不足している引数の数
required 必須の
positional argument 位置引数
'name' 不足している引数名

つまり、

「nameという必須の位置引数が1つ足りません」

というエラーです。


「missing X required positional argument」が発生する原因

主な原因は次の4つです。

  1. 必須引数を指定していない

  2. 複数の引数が不足している

  3. クラスのメソッド呼び出しでselfの扱いを間違えている

  4. 引数の指定方法を間違えている

順番に見ていきましょう。


1. 必須引数を指定していない

最も基本的な原因です。

例えば、次の関数を定義します。

def add(a, b):
    return a + b

この関数には、aとbという2つの引数が必要です。

しかし、

result = add(10)

とすると、bが不足しています。

TypeError: add() missing 1 required positional argument: 'b'

解決方法

不足している引数を指定します。

result = add(10, 20)

print(result)

実行結果:

30

2. 複数の引数が不足している

関数に複数の必須引数がある場合、複数の引数が不足することもあります。

def calculate(a, b, c):
    return a + b + c

次のように呼び出します。

calculate(10)

すると、

TypeError: calculate() missing 2 required positional arguments: 'b' and 'c'

となります。

bとcの2つが不足していることがわかります。

解決方法

3つの引数をすべて指定します。

calculate(10, 20, 30)

3. クラスのメソッドでselfの扱いを間違えている

Python初心者が「missing X required positional argument」で特に遭遇しやすいのが、クラスのメソッドです。

例えば、次のクラスを考えてみましょう。

class Person:
    def greet(self, name):
        print(f"{name}さん、こんにちは")

通常は、インスタンスを作ってメソッドを呼び出します。

person = Person()

person.greet("田中")

これで正常に動作します。

しかし、次のようにクラスから直接呼び出すと問題が発生します。

Person.greet("田中")

実行すると、

TypeError: Person.greet() missing 1 required positional argument: 'name'

のようなエラーになることがあります。

なぜエラーになるのか?

メソッドは、

def greet(self, name):

と定義されています。

つまり、2つの引数を受け取ります。

self
name

通常、

person.greet("田中")

と呼び出すと、Pythonが自動的に、

self → person
name → "田中"

として扱ってくれます。

一方、

Person.greet("田中")

では、"田中"がselfとして扱われます。

そのため、nameが不足します。


4. 引数の指定方法を間違えている

位置引数とキーワード引数の使い方を間違えることでも、引数不足のエラーが発生します。

例えば、

def introduce(name, age):
    print(f"{name}さんは{age}歳です")

という関数があるとします。

次のように呼び出せます。

introduce("田中", 30)

また、

introduce(name="田中", age=30)

のようにキーワード引数を使うこともできます。

しかし、次のようにすると、

introduce(name="田中")

ageが不足しています。

TypeError: introduce() missing 1 required positional argument: 'age'

となります。


required positional argumentとは?

「missing X required positional argument」を理解するには、positional argument(位置引数)について理解しておくとよいでしょう。

例えば、

def add(a, b):
    return a + b

に対して、

add(10, 20)

とすると、

a = 10
b = 20

となります。

このように、指定した位置によって対応する引数が決まるものを位置引数といいます。


位置引数とキーワード引数の違い

Pythonでは、次の2種類の指定方法があります。

位置引数

add(10, 20)

キーワード引数

add(a=10, b=20)

どちらでも実行できます。

def add(a, b):
    return a + b

例えば、

print(add(10, 20))
print(add(a=10, b=20))

どちらも、

30
30

となります。


引数を省略したい場合はデフォルト値を設定する

必ずしも引数を指定しなければならないわけではありません。

関数定義時にデフォルト値を設定すれば、引数を省略できます。

例えば、

def greet(name="ゲスト"):
    print(f"こんにちは、{name}さん")

とします。

この場合、

greet()

と呼び出してもエラーになりません。

実行結果:

こんにちは、ゲストさん

もちろん、

greet("田中")

とすれば、

こんにちは、田中さん

となります。


「missing X required positional argument」の解決手順

このエラーが発生した場合は、次の順番で確認すると解決しやすくなります。

STEP1:エラーメッセージを確認する

例えば、

TypeError: calculate() missing 1 required positional argument: 'price'

なら、

price

という引数が不足しています。


STEP2:関数定義を確認する

関数の定義を確認します。

def calculate(price, tax):
    return price * (1 + tax)

この場合、priceとtaxが必要です。


STEP3:関数を呼び出している部分を確認する

例えば、

calculate(1000)

となっていれば、taxが不足しています。

calculate(1000, 0.1)

のように修正します。


STEP4:クラスのメソッドならselfを確認する

クラスを使用している場合は、

def method(self, value):

のようなメソッドになっていないか確認します。

基本的には、

instance = MyClass()
instance.method(value)

のようにインスタンスから呼び出します。


よくある間違い

間違い1:引数を1つしか渡していない

def multiply(a, b):
    return a * b

multiply(10)

bが不足しています。

修正

multiply(10, 20)

間違い2:関数定義を変更したのに呼び出し側を変更していない

例えば、もともと、

def greet(name):
    print(name)

だったものを、

def greet(name, age):
    print(name, age)

に変更したとします。

呼び出し側が、

greet("田中")

のままだと、

TypeError: greet() missing 1 required positional argument: 'age'

となります。

関数の引数を増やした場合は、呼び出し側も修正する必要があります。


「missing」と「takes X positional arguments」の違い

Pythonでは、引数関連のエラーとして、

missing X required positional argument

と、

takes X positional arguments but Y were given

の2つがよく登場します。

違いは簡単です。

エラー 意味
missing X required positional argument 引数が足りない
takes X positional arguments but Y were given 引数が多すぎる

例えば、

def add(a, b):
    return a + b

に対して、

add(10)

なら、

missing 1 required positional argument

です。

反対に、

add(10, 20, 30)

なら、

takes 2 positional arguments but 3 were given

というエラーになります。

つまり、

引数不足なら「missing」、引数過多なら「takes … but … were given」

と覚えておくと便利です。


「missing X required positional argument」と「TypeError」の関係

このエラーの先頭には、

TypeError

と表示されます。

つまり、

missing X required positional argument

というのは、独立した例外クラスの名前ではありません。

TypeErrorのエラーメッセージの一種です。

そのため、例外処理では、

try:
    add(10)
except TypeError as e:
    print(e)

のようにTypeErrorを捕捉できます。

ただし、エラーを隠してしまう可能性があるため、原因を理解せずにすべてのTypeErrorをexceptするのは避けたほうがよいでしょう。


まとめ

Pythonの、

TypeError: missing X required positional argument

というエラーは、関数やメソッドが要求している必須の位置引数が不足していることを示しています。

例えば、

def add(a, b):
    return a + b

add(10)

では、bが不足しているため、

TypeError: add() missing 1 required positional argument: 'b'

となります。

基本的な解決方法は、エラーメッセージに表示された引数名を確認し、その引数を正しく指定することです。

add(10, 20)

また、引数を省略できるようにしたい場合は、デフォルト値を設定できます。

def greet(name="ゲスト"):
    print(f"こんにちは、{name}さん")

「missing X required positional argument」は、Pythonで関数を扱う際によく遭遇するエラーです。エラーメッセージを読んで「必要な引数が足りない」と判断できるようになると、原因を素早く特定できるようになります。


FAQ

Q1. 「missing X required positional argument」は何が原因ですか?

関数やメソッドを呼び出した際に、定義されている必須引数の数より少ない引数しか指定していないことが主な原因です。

Q2. 「required positional argument」とは何ですか?

省略できない必須の位置引数を意味します。例えば、

def add(a, b):

では、aとbが必須の位置引数です。

Q3. 引数を省略するにはどうすればいいですか?

デフォルト値を設定します。

def greet(name="ゲスト"):
    print(name)

これなら、

greet()

と呼び出してもエラーになりません。

Q4. selfが原因で「missing」が発生することはありますか?

あります。クラスのメソッドをインスタンス経由ではなく、クラスから直接呼び出すと、selfが自動的に渡されないため、引数不足になることがあります。

Q5. missingと「引数が多すぎる」エラーは何が違いますか?

missing X required positional argumentは引数不足です。

一方、

takes X positional arguments but Y were given

は引数が多すぎることを意味します。

他のPythonエラーの原因と対処法はPythonエラー一覧と対処法に種類別でまとめています。エラーメッセージの読み方もあわせて解説しています。

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら