【Python】TypeError: __init__() missing 1 required positional argumentsの原因と解決方法
2020.08.02 /
TypeErrorの一つ、__init__() missing 1 required positional argumentsについて解説していきます。
Pythonを使い始めた頃は、よくこのエラーが発生していましたが、いまだにこのタイプのエラーが発生することがあります。
ちょっとしたミスで引き起こされるエラーですが、なにが起因となって発生してしまうのか。
エラーの意味や発生原因を解説していきます。
TypeErrorの意味
早速ですが、このエラーの意味を説明します。
まずこのエラーは以下のような構文にのっとって表示されます。
TypeError:関数名() missing 数値 required positional arguments: 引数名など
エラーは英語で表記されますが、これを日本語に翻訳すると以下のようになります。
「TypeError:関数()に必要な引数が数値分足りないです」
といった意味になります。
これはどういった意味かというと、関数に渡すべき引数が数値分足りていないということですね。
ではこのエラーを解決するためには、関数に必要な数の引数を渡すようにすればいいということです。
どういった状況でこのエラーが発生するのか、どうやって解決するのかを次項から解説していきます。
クラス内の関数呼び出し時の注意
エラー発生ケースを確認していく前に、クラス内の関数を呼び出す場合の注意を見ていきましょう。
Python独特の仕様ですが、クラス内の関数を呼び出す際にselfが引数の1つ目としてクラス内関数に渡されます。
class Office:
def __init__(self):
print('Office54')
x = Office() #インスタンス化
上記のサンプルプログラムで詳しく説明すると、4行目でインスタンス化した際にコンストラクタである__init__関数が走ります。
そして先ほど説明したように、__init__にselfが渡されます。
そのため__init__(self)と引数selfを受け取る記述が必要になります。
以上を前提条件として、TypeError: __init__() missing 1 required positional argumentsの発生パターンや解決策を解説していきます。
渡す引数が少ない場合
class Office:
def __init__(self, x):
print('Office54' + x)
x = Office()
TypeError: __init__() missing 1 required positional argument: 'x'
すでにエラーの意味がわかっているので、渡すべき引数xが足りていないことはおわかり方と思います。
このエラーを解決するために、xを__init__関数に渡すように書き直してみます。
class Office:
def __init__(self, x):
print('Office54' + x)
x = Office(‘.net’)
Office54.net
以上のように無事エラーが発生せずにプログラムを実行することができます。
したがって、このようにコンストラクタで引数を設定しているのに、それを渡していない場合にエラーが発生いたします。
またコンストラクタにかかわらず、関数に対して渡す引数の数が足りていない場合、同様にエラーが発生いたします。
インスタンス化がない場合
class Office:
def five_four(self):
print(‘Office54’)
Office.five_four()
TypeError: five_four() missing 1 required positional argument: 'self'
上記のサンプルプログラムでは、Officeクラス内のfive_four関数を呼び出して、エラーが発生しました。
本来クラスはインスタンス化して使うべきですが、サンプルではインスタンス化していないため、エラーが発生しております。
この場合は、クラスをインスタンス化してから使えばエラーを避けることができます。
class Office:
def five_four(self):
print('Office54')
x = Office()
x.five_four()
逆に多く引数を渡した場合のエラー
今回のエラーTypeError: __init__() missing 1 required positional argumentsは、関数に渡す引数が少ない場合に発生するエラーです。
では逆に多く引数を渡すとどうなるか?
答えは、以下の記事に記載しているので、気になる方はご覧ください。
【Python】TypeError: 関数名 takes 0 positional arguments but 1 was givenの原因と解決方法