閉じる

【Python】TypeError頻出15例|list is not callableなど徹底解説

Pythonで開発していると、TypeErrorに悩まされる場面は少なくありません。

とくに「list is not callable」や「’int’ object is not callable」などのエラーは、初心者だけでなく中級者でもうっかり遭遇する代表例です。

本記事では、PythonのTypeErrorの基本から、頻出パターン15例、そして「list is not callable」を中心に、原因の読み解き方と防ぎ方を丁寧に解説していきます。

目次 [ close ]
  1. PythonのTypeErrorとは
    1. TypeErrorの意味と発生するタイミング
    2. 「型」と「オブジェクト」の基本をおさらい
    3. TypeErrorを読むコツとエラーメッセージの構造
  2. TypeError頻出パターン15例
    1. 1.list is not callableの原因と対処法
    2. 2.'int' object is not callableが出る典型ケース
    3. 3.'str' object is not callableで関数呼び出しに失敗する理由
    4. 4.'NoneType' object is not callableになるパターン
    5. 5.'list' object is not subscriptableとcallableの取り違え
    6. 6.can only concatenate str(not "int") to strの意味
    7. 7.unsupported operand type(s) for +の原因
    8. 8.unsupported operand type(s) for /や*など演算子関連TypeError
    9. 9.cannot unpack non-iterable XXX objectのパターン
    10. 10.'XXX' object is not iterableでループできない理由
    11. 11.TypeError: 'module' object is not callableの落とし穴
    12. 12.TypeError: 'type' object is not subscriptable
    13. 13.TypeError: object of type 'XXX' has no len
    14. 14.TypeError: slice indices must be integers or None or have an __index__ method
    15. 15.TypeError: missing 1 required positional argumentなど引数関連エラー
  3. list is not callableエラーを徹底解説
    1. list is not callableが起きる典型コード例
    2. 変数名と組み込み関数名の衝突(上書き)パターン
    3. list()と[]の使い分けとベストプラクティス
    4. list is not callableを防ぐ変数命名のコツ
  4. TypeErrorの防ぎ方とデバッグのコツ
    1. Pythonの型チェックでTypeErrorを事前に防ぐ方法
    2. isinstanceとtypeで型を確認する手順
    3. mypyなど型ヒント(typing)を使った静的チェック
    4. トレースバック(traceback)から原因を特定する読み方
  5. まとめ

PythonのTypeErrorとは

TypeErrorの意味と発生するタイミング

PythonのTypeErrorは、「その型(タイプ)のオブジェクトに対して、その操作はできません」という意味のエラーです。

もう少し具体的に言うと、次のような場面で発生します。

たとえば、整数と文字列をそのまま+で足そうとしたり、リストを関数のように()で呼び出そうとしたり、イテレートできないオブジェクトをfor文で回そうとしたときなどです。

Pythonは「この型に対して、この操作は定義されていません」と判断し、TypeErrorを投げます。

このようにTypeErrorは、「演算子・関数・文法上の操作」と「オブジェクトの型」の組み合わせミスによって起きると考えると理解しやすくなります。

「型」と「オブジェクト」の基本をおさらい

Pythonでは、すべてがオブジェクトです。

整数も文字列もリストも関数も、すべてオブジェクトとして扱われます。

そして、各オブジェクトは必ず「型(type)」を持っています。

代表的な型には次のようなものがあります。

  • int型: 整数
  • float型: 小数
  • str型: 文字列
  • list型: リスト
  • dict型: 辞書
  • function型: 関数オブジェクト

Pythonでは、オブジェクトがどの型なのかによって使える演算子やメソッド、振る舞いが変わります

たとえば+演算子は、int同士なら数値としての加算、str同士なら文字列の結合として働きます。

しかしintstrを混ぜて+しようとすると、後述するTypeErrorになります。

TypeErrorを読むコツとエラーメッセージの構造

Pythonのエラーメッセージにはパターンがあります。

TypeErrorの場合、「TypeError: メッセージ本文」という形式で表示され、そのメッセージ本文を読み解くのが重要です。

例えば、次のようなエラーを見てみます。

Python
x = 10
print(x())

このコードを実行すると、次のようなエラーメッセージになります。

実行結果
TypeError: 'int' object is not callable

このメッセージを分解すると次のようになります。

  • ‘int’ object: 問題を起こしたオブジェクトの型
  • is not callable: 「関数として呼び出せない」という意味

つまり「int型のオブジェクトを関数のように呼び出そうとしましたが、それはできません」という意味になります。

このように、エラーメッセージの中に「どの型」で「どんな操作」が問題になっているかがほぼ必ず書かれているので、そこを手がかりに原因を特定していきます。

同じように、unsupported operand type(s) for +なら「この+で足そうとした型の組み合わせはサポートされていません」、object is not iterableなら「ループ可能(iterable)な型ではありません」と読むことができます。

TypeError頻出パターン15例

ここからは、Pythonで特によく遭遇するTypeErrorパターン15例を、原因と対処法を交えながら解説します。

コード例にはコメントを多く付けて、どこで何が起きているのかが分かるようにしています。

1.list is not callableの原因と対処法

もっとも有名なエラーの1つがTypeError: ‘list’ object is not callableです。

代表的な原因は、変数名としてlistを使ってしまい、組み込み関数list()を上書きしてしまうことです。

Python
# 組み込み関数 list を上書きしてしまう例
list = [1, 2, 3]       # ここで変数名 list を使っている

# 本当は list() で型変換をしたい
numbers = list("123")  # ここで TypeError が発生
実行結果
TypeError: 'list' object is not callable

この場合、2行目でlistにリストオブジェクトを代入したため、名前listはもはや「関数」ではなく「リスト」を指してしまっています

その状態でlist("123")と書くと、リストを関数のように呼び出そうとしてしまい、「リストは呼び出せません」と怒られるわけです。

対処法としては、組み込み関数名(list, str, intなど)を変数名に使わないことが最善です。

どうしても既に上書きしてしまっている場合は、変数名を変更し、Pythonインタプリタを再起動することで元に戻せます。

2.’int’ object is not callableが出る典型ケース

TypeError: ‘int’ object is not callableは、整数型のオブジェクトを関数のように()で呼び出そうとしたときに発生します。

代表的には次のようなケースがあります。

Python
x = 10

# 本当は関数 x を呼び出したかったのに、
# どこかで x に数値を代入してしまっているパターン
result = x()  # ここで 'int' object is not callable

あるいは、次のような「関数名と変数名の衝突」も典型的です。

Python
def calc():
    return 10

calc = calc()  # 関数を実行して、結果(10)を calc に代入

# 以降、calc はもう関数ではなく「10」という整数になる
calc()  # ここで 'int' object is not callable

このように、関数を結果で上書きしてしまうと、以降その名前は関数ではなくなるため注意が必要です。

関数実行結果を保持したい場合は、別の変数名を用意するのが安全です。

3.’str’ object is not callableで関数呼び出しに失敗する理由

TypeError: ‘str’ object is not callableは、文字列を関数として呼び出そうとしたときのエラーです。

典型例を見てみます。

Python
text = "hello"

# () を付けると関数呼び出しになる
text()  # 'str' object is not callable

もう少し現実的な例として、printを上書きしてしまい、文字列になっているケースもあります。

Python
print = "出力"   # 組み込みの print 関数を上書き

print("hello")   # ここで 'str' object is not callable

このエラーも本質的には、「関数名として使うつもりの名前に、別の型のオブジェクトを代入してしまっている」ことが原因です。

組み込み関数名を変数名として利用しないこと、関数と同じ名前の変数を無意識に作らないことが重要になります。

4.’NoneType’ object is not callableになるパターン

TypeError: ‘NoneType’ object is not callableは、None(何もないことを表す特別な値)を関数として呼び出してしまったときに発生します。

次のようなケースが典型的です。

Python
def func():
    print("処理だけして、値は返さない関数です")  # return がないので None を返す

result = func()  # result は None になる

result()         # ここで 'NoneType' object is not callable
実行結果
処理だけして、値は返さない関数です
TypeError: 'NoneType' object is not callable

原因は、「関数の返り値が関数そのものだと思い込んで、もう一度()を付けて呼び出している」ことです。

関数を呼び出した結果が何なのかを意識し、必要であればprint(result)などで確認しながらデバッグすると原因が見えやすくなります。

5.’list’ object is not subscriptableとcallableの取り違え

TypeError: ‘list’ object is not subscriptableという似たエラーもあり、callable(呼び出せる)とsubscriptable(添字アクセス可能)を混同しやすいので注意が必要です。

「subscriptable」は[]で要素を取り出せるオブジェクトかどうかを表します。

例えば次のようなケースで起きます。

Python
x = 10

# 数値は [] で要素アクセスできない
value = x[0]  # 'int' object is not subscriptable

一方で'list' object is not callable()に関するエラーです。

エラー文言がよく似ているため、どちらの記号で間違えたのかをメッセージから読み取る意識を持つと、原因の切り分けが早くなります。

6.can only concatenate str(not “int”) to strの意味

TypeError: can only concatenate str (not “int”) to strは、文字列同士しか+で連結できないのに、文字列と整数をそのまま足そうとしたときに起きるエラーです。

Python
age = 20

# 文字列と整数をそのまま + している
msg = "年齢は " + age + " 歳です"  # ここで TypeError
実行結果
TypeError: can only concatenate str (not "int") to str

メッセージを直訳すると「strにはstrだけを連結できます(intはダメです)」という意味です。

対処法は、整数をstr()で文字列に変換するか、f文字列formatを使うことです。

Python
age = 20

# 対処法1: str()で文字列に変換
msg = "年齢は " + str(age) + " 歳です"

# 対処法2: f文字列を使う
msg2 = f"年齢は {age} 歳です"

print(msg)
print(msg2)
実行結果
年齢は 20 歳です
年齢は 20 歳です

7.unsupported operand type(s) for +の原因

TypeError: unsupported operand type(s) for +: ‘XXX’ and ‘YYY’は、その2つの型の組み合わせに対して+演算子が定義されていないことを示します。

例えば次のようなコードです。

Python
a = 10       # int
b = [1, 2]   # list

c = a + b    # int と list を足そうとしている
実行結果
TypeError: unsupported operand type(s) for +: 'int' and 'list'

このメッセージから、「intとlistの組み合わせでは+は使えません」と読み取れます。

どちらか一方を変換するのか、そもそも+ではなく別の処理(h関数やappendなど)を使うべきなのかを検討して修正します。

8.unsupported operand type(s) for /や*など演算子関連TypeError

unsupported operand type(s)+以外の演算子でも頻出します。

たとえば/*で次のようなコードを書いた場合です。

Python
a = "10"
b = 2

result = a / b  # 文字列と数値で割り算
実行結果
TypeError: unsupported operand type(s) for /: 'str' and 'int'

割り算に限らず、演算子は「どの型とどの型の組み合わせに対応しているか」が決まっているため、それを外れるとTypeErrorになります。

とくに入力値を外部から受け取る場面では、数値に変換できているか、文字列のままではないかを確認することが重要です。

9.cannot unpack non-iterable XXX objectのパターン

TypeError: cannot unpack non-iterable XXX objectは、反復不可能(non-iterable)なオブジェクトを複数の変数にアンパックしようとしたときのエラーです。

Python
value = 10    # int は iterable ではない

# 左辺に2つの変数があるので、右辺から2つの値を取り出そうとする
a, b = value  # ここで TypeError
実行結果
TypeError: cannot unpack non-iterable int object

一方で、タプルやリストなどのイテラブルであればアンパックできます。

Python
pair = (1, 2)

a, b = pair   # OK
print(a, b)
実行結果
1 2

エラーメッセージのXXXの部分に注目すると、どの型をアンパックしようとしていたかが分かるので、意図した型になっているかを確認するのがデバッグの第一歩になります。

10.’XXX’ object is not iterableでループできない理由

TypeError: ‘XXX’ object is not iterableは、forループやアンパックなどで「繰り返し可能(iterable)」なオブジェクトでないものを使ったときに発生します。

Python
n = 10

for x in n:   # int は iterable ではない
    print(x)
実行結果
TypeError: 'int' object is not iterable

iterableとは「順番に要素を取り出せるオブジェクト」のことです。

list, tuple, str, dict, rangeなどはiterableですが、intfloatNoneはiterableではありません。

このエラーが出たときは、「forの右側に置いているものは、本当にリストやタプルなどか?」と確認してみてください。

タプルを返すはずが、1つの値しか返していない関数などでもよく出るエラーです。

11.TypeError: ‘module’ object is not callableの落とし穴

TypeError: ‘module’ object is not callableは、モジュールそのものを関数のように呼び出してしまったときに起きます。

Python
import math

# math はモジュール(ファイルの集合)なので、関数ではない
result = math()  # ここで TypeError
実行結果
TypeError: 'module' object is not callable

同様に、次のようなパターンも落とし穴になりがちです。

Python
import mymodule  # mymodule.py というファイルをインポートしたとする

# mymodule の中に main() という関数があるのに、
# ファイル名そのものを呼び出そうとしている
mymodule()  # 'module' object is not callable

対処法は、モジュール内の関数やクラスを指定して呼び出すことです。

例えばmath.sqrt(4)のようにモジュール名.関数名という形でアクセスします。

12.TypeError: ‘type’ object is not subscriptable

TypeError: ‘type’ object is not subscriptableは、型そのもの(クラス)に対して[]で添字アクセスしようとしたときに発生します。

Python
# list は「型」そのもの
value = list[0]  # ここで TypeError
実行結果
TypeError: 'type' object is not subscriptable

添字アクセスできるのは、その型のインスタンス(具体的なオブジェクト)です。

Python
data = [1, 2, 3]  # list 型のインスタンス(オブジェクト)

value = data[0]   # OK
print(value)
実行結果
1

型とインスタンスを混同しているときに起きることが多いので、変数が「型」なのか「インスタンス」なのかを意識して名前を付けると、この種のミスを減らせます。

13.TypeError: object of type ‘XXX’ has no len

TypeError: object of type ‘XXX’ has no len()は、len()関数を、その型に対しては定義されていないのに使おうとしたときのエラーです。

Python
n = 10
length = len(n)  # int に対して len() を呼び出している
実行結果
TypeError: object of type 'int' has no len()

len()は「要素の個数」を返す関数なので、要素の概念がある型(リスト、タプル、文字列、辞書など)に対して意味を持ちます。

一方でintfloatのようなスカラ値には、要素数という概念がありません。

このエラーが出た場合は、本当にlen()を呼びたい相手がどの変数なのかを再確認すると良いです。

リストを想定していたのに、1つの値だけを渡しているといったミスが多く見られます。

14.TypeError: slice indices must be integers or None or have an __index__ method

このエラーメッセージは少し長いですが、意味は「スライスのインデックスには整数かNone、あるいは__index__メソッドを持つオブジェクトしか使えません」というものです。

Python
text = "hello"

# インデックスに文字列を使ってしまっている
part = text["1":"3"]  # ここで TypeError
実行結果
TypeError: slice indices must be integers or None or have an __index__ method

通常の利用では、スライスのインデックスに「文字列」や「浮動小数点」などを使ってしまっているケースがほとんどです。

インデックスが整数になっているかどうかを確認し、必要であればint()で変換します。

Python
text = "hello"

start = "1"
end = "3"

# 文字列を整数に変換してから使う
part = text[int(start):int(end)]
print(part)
実行結果
el

15.TypeError: missing 1 required positional argumentなど引数関連エラー

最後に、TypeError: missing 1 required positional argument: ‘xxx’のような、関数の引数の数や渡し方に関するTypeErrorです。

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

# 引数が1つ足りない
result = add(10)  # ここで TypeError
実行結果
TypeError: add() missing 1 required positional argument: 'b'

メッセージの中の'b'は、足りない引数の名前を示しています。

逆に、takes 2 positional arguments but 3 were givenのように、「渡しすぎ」の場合もあります。

この種のエラーが出たときは、関数の定義と呼び出し側の引数の個数・名前を見比べることがもっとも確実な確認方法です。

list is not callableエラーを徹底解説

ここからは、本記事のタイトルにも含まれている「list is not callable」に絞って、もう少し深く掘り下げて解説します。

list is not callableが起きる典型コード例

典型的なパターンはすでに軽く触れましたが、もう少し具体例を見てみます。

Python
# ユーザーから入力された数値を1文字ずつのリストにしたい
numbers_str = input("数字を入力してください: ")

list = []  # 良くない例: 変数名に list を使用

# 本当は list() を使って文字列を1文字ずつリストにしたい
digits = list(numbers_str)  # ここで 'list' object is not callable
print(digits)
実行結果
数字を入力してください: 123
TypeError: 'list' object is not callable

このコードの問題は、「自分で定義した変数listが、Python組み込みのlist()関数を上書きしてしまっている」ことです。

そのためlist(numbers_str)は「空リスト[]を関数として呼び出そうとしている」ことになり、TypeErrorになります。

変数名と組み込み関数名の衝突(上書き)パターン

Pythonでは、同じ名前を後から再代入すると、もともとの意味は上書きされます

これは組み込み関数名であっても同じです。

Python
print(list)  # <class 'list'> が表示される(組み込みの list 型)

list = [1, 2, 3]  # ここで上書き

print(list)  # [1, 2, 3] が表示される(ただのリスト)
実行結果
<class 'list'>
[1, 2, 3]

この状態でlist("123")とすると、すでにlistは「関数」ではなく「リスト」を指しているため、「リストオブジェクトは呼び出せません」という意味で'list' object is not callableが出るというわけです。

このパターンはlist以外にも、str, int, dict, set, printなど、さまざまな組み込み名前で起こりえます。

list()と[]の使い分けとベストプラクティス

list()と[]はどちらもリストに関係しますが、役割が少し違います

次の表で違いを整理します。

用途list()[]
空リストを作るlist()[]
既存イテラブルをリスト化list("abc") → ['a','b','c']対応なし(構文では不可)
リテラルで要素を直接指定冗長(list([1,2])など)[1, 2]が標準

空リストを作るときは[]を使うのが一般的で、他のイテラブルからリストを作りたいときにlist()を使うと覚えておくとよいです。

Python
# 空リストを作る一般的な書き方
result = []

# rangeオブジェクトからリストを作るときは list()
numbers = list(range(5))  # [0, 1, 2, 3, 4]

list is not callableを防ぐ変数命名のコツ

「list is not callable」を根本的に防ぐには、変数名の付け方を少し工夫するのが効果的です。

おすすめのコツは次の通りです。

1つ目に、組み込み名と同じ名前を付けないことです。

代表的な組み込み名にはlist, str, int, dict, set, input, printなどがあるので、これらは変数名にしないようにします。

2つ目に、「中身」を表す意味のある名前を付けることです。

たとえばリストならitems, numbers, user_listなど、「何のリストか」が分かる名前にすると、組み込み名との衝突も避けやすくなります。

3つ目に、エディタやLinterの警告を活用することです。

多くのIDEやLinterは、組み込み名を上書きしようとすると警告を出してくれます。

VS CodeやPyCharmなどを利用している場合は、これらの警告を有効にしておくと安心です。

TypeErrorの防ぎ方とデバッグのコツ

最後に、TypeError全般を減らし、発生したときに素早く原因を特定するためのテクニックを紹介します。

Pythonの型チェックでTypeErrorを事前に防ぐ方法

Pythonは動的型付け言語ですが、型ヒントや補助的なチェックによってTypeErrorを事前に防ぐことができます

代表的な方法としては、次のようなものがあります。

  • 関数に型ヒントを付ける
  • 静的型チェッカー(mypyなど)を使う
  • テストコードを書き、さまざまな入力パターンで実行してみる

型ヒントを付けるだけでも、エディタが「ここにはintが入るべき」「ここにはstrが入るべき」と推論しやすくなり、明らかな型ミスを早期に発見しやすくなります。

isinstanceとtypeで型を確認する手順

デバッグのときに非常に役立つのがtype()isinstance()です。

これらを使って、「今この変数は本当にどの型なのか?」を確認できます。

Python
def debug_type(value):
    print("値:", value, "型:", type(value))

x = [1, 2, 3]
debug_type(x)

y = "hello"
debug_type(y)
実行結果
値: [1, 2, 3] 型: <class 'list'>
値: hello 型: <class 'str'>

isinstance()を使うと、ある型かどうかを判定できます。

Python
value = [1, 2, 3]

if isinstance(value, list):
    print("value はリストです")
else:
    print("value はリストではありません")
実行結果
value はリストです

TypeErrorが発生している箇所の直前にprint(type(x))などを入れて実際の型を確認すると、「リストのはずがNoneになっている」といった問題にすぐ気づけるようになります。

mypyなど型ヒント(typing)を使った静的チェック

型ヒント(typing)と静的型チェッカーを併用することで、実行前にTypeErrorの予備軍を検出できます。

簡単な例を見てみます。

Python
# sample.py
def add(a: int, b: int) -> int:
    return a + b

result = add(10, "20")  # 本当は str を渡してしまっている
print(result)

このコードはPythonとしては実行できますが、実行時にunsupported operand type(s) for +のTypeErrorが出ます。

ここでmypyを使うと、実行前に問題を指摘してくれます。

Shell
mypy sample.py
実行結果
sample.py:5: error: Argument 2 to "add" has incompatible type "str"; expected "int"
Found 1 error in 1 file (checked 1 source file)

このように、型ヒントと静的チェックを導入しておくと、「本来はintを期待している関数にstrを渡している」といったミスを早い段階で見つけることができます

トレースバック(traceback)から原因を特定する読み方

最後に、TypeErrorに限らずPythonのエラー全般で重要なのが、トレースバック(traceback)の読み方です。

トレースバックは「どのファイルの何行目で、どの関数経由でエラーに至ったか」の履歴です。

簡単な例を示します。

Python
def inner():
    x = 10
    print(x())
    
def outer():
    inner()
    
outer()

これを実行すると次のようなトレースバックが出ます。

実行結果
Traceback (most recent call last):
  File "example.py", line 8, in <module>
    outer()
  File "example.py", line 6, in outer
    inner()
  File "example.py", line 3, in inner
    print(x())
TypeError: 'int' object is not callable

読み方のポイントは次の通りです。

  • 一番下の行に「例外の種類(TypeError)」と「メッセージ本文」が書かれている
  • その直前の行が実際にエラーが起きた場所(ファイル・行番号・コード行)を示す
  • さらにその上に、「どの関数から呼ばれてここに至ったか」の履歴がスタック状に並んでいる

TypeErrorが出たときは、一番下のメッセージで「どの型」で「どんな操作」が問題なのかを把握し、その直前のコード行を注意深く確認することが、原因特定の近道になります。

まとめ

PythonのTypeErrorは、「型」と「操作」の組み合わせミスを教えてくれる重要なサインです。

「list is not callable」や「’int’ object is not callable」など、頻出する15のパターンを理解しておくと、エラーメッセージを見ただけで原因の見当がつくようになります

とくに組み込み名と変数名の衝突、演算子と型の対応、iterableやcallableといった性質を意識すると、TypeErrorはぐっと減らせます。

型ヒントやmypy、isinstance()による確認、そしてトレースバックの読み方を身につけ、TypeErrorを「怖いもの」ではなく「バグ発見のガイド」として活用していきましょう。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!