PythonのTypeError「'method' object is not subscriptable」エラーの原因と解決方法
Pythonでメソッドを呼び出す際、引数は必ず丸括弧( )の中に指定する必要があります。これは、関数やメソッドが呼び出されているかどうかをインタープリタが判断するために丸括弧が使われるためです。もし誤って角括弧 [ ] を使ってメソッドを呼び出そうとすると、「TypeError: 'method' object is not subscriptable」というエラーが発生します。
この記事では、このエラーの意味と発生原因を解説し、実際のコード例をもとに解決方法をわかりやすく紹介します。
TypeError: 'method' object is not subscriptable とは
「サブスクリプト可能(subscriptable)」なオブジェクトとは、__getitem__ メソッドを持つオブジェクトのことです。リスト、辞書、タプルなどのデータ型がこれに該当します。__getitem__ メソッドのおかげで、Pythonインタープリタはコレクションから個々の要素を取り出すことができます。
しかし、すべてのオブジェクトがサブスクリプト可能というわけではありません。たとえばメソッドは __getitem__ メソッドを実装していないため、サブスクリプト可能ではありません。つまり、角括弧構文を使ってメソッドの要素にアクセスしたり、メソッドを呼び出したりすることはできないのです。
次のコードを見てみましょう。
cheeses = ["Edam", "Stilton", "English Cheddar", "Parmesan"] print(cheeses[0])
このコードは、インデックス位置0にあるチーズ「Edam」を出力します。リストのようなサブスクリプト可能なオブジェクトには角括弧でアクセスできますが、関数やメソッドはサブスクリプト可能ではないため、角括弧で呼び出すことはできません。
エラーが発生する具体例
ここでは、チーズの情報をオブジェクトとして管理するプログラムを作成してみます。チーズを定義するための「Cheese」クラスには、あるチーズが特定の原産国のものかどうかを確認できるメソッドを持たせます。
まず、チーズ用のクラスを定義しましょう。このクラスを「Cheese」と名付けます。
class Cheese:
def __init__(self, name, origin):
self.name = name
self.origin = origin
def get_country(self, to_compare):
if to_compare == self.origin:
print("{} is from {}.".format(self.name, self.origin))
else:
print("{} is not from {}. It is from {}.".format(self.name, to_compare, self.origin))
このクラスには2つのメソッドが含まれています。1つ目の __init__ メソッドはCheeseオブジェクトの構造を定義し、2つ目の get_country() メソッドは、チーズの原産国が特定の値と一致するかどうかを確認するものです。
次に、Cheeseクラスからオブジェクトを作成します。
edam = Cheese("Edam", "Netherlands")
変数「edam」はオブジェクトです。このチーズの名前は「Edam」で、原産国は「Netherlands(オランダ)」です。
続いて、get_country() メソッドを呼び出してみましょう。
edam.get_country["Germany"]
このコードは、Cheeseクラスの get_country() メソッドを実行し、「edam」オブジェクトの「origin」の値が「Germany」と一致するかどうかを確認するつもりのものでした。しかし、コードを実行すると次のようになります。
Traceback (most recent call last): File "main.py", line 14, in <module> edam.get_country["Germany"] TypeError: 'method' object is not subscriptable
エラーが発生してしまいました。
解決方法
Pythonデバッガーがエラー箇所として指摘したコード行を分析してみましょう。
edam.get_country["Germany"]
このコードでは、get_country() メソッドを角括弧を使って呼び出しています。これは正しい構文ではありません。角括弧はリストなどの要素へアクセスするために使われるものであり、関数やメソッドはサブスクリプト可能ではないため、角括弧で呼び出すことはできないのです。
このエラーを解決するには、角括弧を丸括弧に置き換えます。
edam.get_country("Germany")
コードを実行してみましょう。
Edam is not from Germany. It is from Netherlands.
今度はコードが正常に実行されました。「Edamはドイツ産ではなく、オランダ産である」というメッセージが出力されています。次に、指定した値が原産国と一致する場合にも正しく動作するか確認してみます。
edam.get_country("Netherlands")
実行結果:
Edam is from Netherlands.
指定した値がチーズの原産国と一致する場合でも、コードは正しく動作しました。
まとめ
「TypeError: 'method' object is not subscriptable」エラーは、クラス内のメソッドを角括弧を使って呼び出そうとしたときに発生します。このエラーを解決するには、呼び出したいメソッド名の後に必ず丸括弧を使ってメソッドを呼び出すようにしてください。
これで、あなたもこのよくあるPythonエラーをプロのように解決できるようになりました!
-
JavaScriptのTypeError:「'undefined' is not an object」エラーの原因と対処法
「TypeError: undefined is not an object」というエラーは、値が undefined(未定義)のオブジェクトに対して、プロパティへのアクセスやメソッドの呼び出しを行った場合に発生します。 このエラーメッセージが表示されるのは Safari ブラウザのみという点に注意が必要です。Chrome や Firefox などのブラウザでは、同じ状況でも「Cannot read properties of undefined (reading xxx)」のような、少し異なる文言でエラーが出力されます。そのため、Safari でのみ発生するバグとして報告されることも多くあり
-
Pythonの「not in」演算子とは?メンバーシップ演算子の使い方を解説
「not in」演算子の基本Pythonには、inとnot inという2つのメンバーシップ演算子(membership operators)が用意されています。これらは、あるオブジェクトが文字列(str)、リスト(list)、タプル(tuple)などのシーケンス型オブジェクトに含まれているかどうかを判定するために使われます。このうちnot in演算子は、指定したオブジェクトがシーケンス内に存在しない場合にTrueを返し、存在する場合にFalseを返します。つまり、in演算子の結果を反転させた動作になります。文字列に対する使用例まず、文字列に対してnot inを使った例を見てみましょう。>