概要
Python を書いていると以下のようなエラーで躓くことがあります。
TypeError: 'list' object is not callable
TypeError: 'str' object is not callable
TypeError: 'int' object is not callable
このエラーは関数を実行しようとしたが、実行しようとしたものは listオブジェクト(もしくはstr, int)であるため関数として実行できない、というエラーです。
実行しようとしたものが関数として定義されていればこのエラーは出ませんが、何らかの事情でその関数を別のオブジェクトとして上書きしてしまった場合などに起きるケースが多いです。
実際に type() を利用して実行したい関数の型を確認すると、別のオブジェクトに上書きされてしまっていることが分かります。
print(type(sample_func))
<class 'int'>
# このように、<class 'function'> もしくは <class 'builtin_function_or_method'>では無くなっている
従って、具体的な対処法は以下です。
どこで上書きされたかを特定してコードを修正する
関数としてしっかり定義したはずなのに、という場合は以下のように関数をどこかで上書きしてしまっている可能性が高いです。
# 関数として定義しているが...
def sample_func(a):
print(a)
---なにかの処理----
# どこかでこのように上書きしてしまっている
sample_func = 1
# この場合、当然関数として実行できない ( TypeError: 'int' object is not callable )
sample_func("Hello!")
エディタの検索機能(Ctrl + f など)で関数名で検索を行い、上書きしてしまっている箇所が特定できればそこを修正することで問題が解消します。
組み込み関数の場合は del 文を使って上書きした変数を削除する
Pythonには import しなくても最初から使える組み込み関数があります。
具体的には以下のドキュメントに記載されているものがそれにあたります。
よく使うものの例としては、print() のような出力の関数、int() や str()、list() などの型に関する関数、max() や min() などの数値比較に関する関数などが挙げられます。
Pythonの仕様で、これらの組み込み関数も上書きできるようになっています。
例えば以下のように max() を上書きしてしまう、というケースを見かけることが多いです。
# まだ上書きされてないので 1 が出力される
print(max(0, 1))
--- なにかの処理 ----
# 何かの最大値を一時的に保持したくて max という変数を作ったつもりで上書きしてしまう
max = 999
--- なにかの処理 ----
# max関数がint型オブジェクトで上書きされているため TypeError: 'int' object is not callable が出る
print(max(0, 1))
組み込み関数の場合は、上書きしてしまった変数を del することで元の使える状態に戻すことができます。
# del文でmaxを削除
del max
# 組み込み関数 max() が使えるように戻る
max(0, 1) # 1が出力される
Juypyter Notebook などを使用していて、セルを一番上から実行するのが大変な場合はこういう対処法も良いと思います。
※ただし、基本的に関数は上書きしないように命名規則などをきちんと定めておくことを推奨します。
コメント