2018年7月15日日曜日

【Python】TypeError: 'int' object is not callable  ビルトイン関数と同じ変数名を使った時に起こるエラー

今日、Pythonのプログラムを書いていたら、

TypeError: 'int' object is not callable

のようなエラーを出しました。

このエラーの主な原因は、 ビルトイン関数 と同じ名前の変数(sum, max, min, str等)を定義した事です。

ビルトイン関数(built-in function)とは、元から備え付けられてる関数です。 ビルトイン関数を使うのに、 ユーザーが独自に関数を定義したり、特に何かライブラリをインポートする必要はありません。

ビルトイン関数を和訳すると、「組み込み関数」らしいです。

今からエラーの具体例をあげて説明します。

sumという整数型の変数を定義した

>>> this_is_a_list = [i for i in range(1,10)]
>>> this_is_a_list
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> sum(this_is_a_list) # sum が使える
45
>>> sum = 0
>>> for i in range(10):
...     sum += i
...
>>> sum
45
>>> sum(this_is_a_list) # sum が使えない
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable

sum は リストの合計値を計算するときによく使われるビルトイン関数です。

それと同じ名前の変数sum を定義してしまったから、 ビルトイン関数としてのsumを呼び出す事ができなくなったわけです。

今日、これと全く同じ間違いをしました。 合計した値を扱う変数名はtotal と定義したほうがいいかもしれません。

strという文字列の変数を定義した

>>> this_is_a_string = str(100)
>>> type(this_is_a_string)
<class 'str'>
>>> str = 'test'
>>> this_is_a_string = str(100)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object is not callable

strは、数字を文字列に変換する時によく使われるビルトイン関数です。

それと同じ名前の変数str を定義してしまったから、 ビルトイン関数としてのstrを呼び出す事ができなくなったわけです。

私は「人の名前の文字列はname」「 色の名前の名前はcolor」 「都市の名前の文字列はcity」 のように変数名を定義します。

maxという整数型の変数を定義した

>>> max(3**6, 1000) # 関数maxが使える
1000
>>> max(3**7, 1000) # 関数maxが使える
2187
>>> max, i = 0, 0
>>> while True:
...     if 3**(i+1) <= 1000:
...         i += 1
...     else:
...         break
...
>>> max = i
>>> max
6
>>> max(3**6, 1000) # 関数maxが使えない
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable

maxは、リストの要素の最大値を計算する時によく使われるビルトイン関数です。

それと同じ名前の変数max を定義してしまったから、 ビルトイン関数としてのmaxを呼び出す事ができなくなったわけです。

最大値を求める時、maxという変数を使いたくなります。 3文字だから書きやすいですし。

でも、私は、ビルトイン関数のmaxとかぶらないように、 greatestmaximumという変数名を使います。

lenという整数型の変数を定義した

>>> animal = "rabbit"
>>> len(animal)
6
>>> len = 0
>>> len(animal)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable

lenは、「文字列の長さ」や「リストに含まれる要素の個数」 を求める時によく使われるビルトイン関数です。

それと同じ名前の変数len を定義してしまったから、 ビルトイン関数としてのlenを呼び出す事ができなくなったわけです。

まとめ

sumはもともと関数の名前ですが、 sumという名前の整数型(int)の変数を定義してしまうと、 sumは整数型(int)の変数として扱われます。 sumを関数として使いたくても、呼び出せません。

それが「TypeError: 'int' object is not callable」 の意味です。

0 件のコメント:

コメントを投稿

投稿されたコメントは承認後に公開されます。