HOWTO · Python
Python で呼び出せないエラーリストオブジェクトを修正
このチュートリアルでは、Python で呼び出せないエラーリストオブジェクトを修正する方法を示します。
このページの内容
タイプエラーは、Python プログラムの一般的な標準例外の一部です。多くの場合、正しい構文に準拠しなかったり、サポートされていないデータ型の操作が原因で発生します。
このエラーは、通常の関数オブジェクトを呼び出すのと同じように、呼び出し不可能なオブジェクトを呼び出そうとしたときによく発生します。以下のコードスニペットは、正しい Python 構文に違反しているため、TypeError を返します。
nums = [23, 34, 56, 67]
nums()
出力:
Traceback (most recent call last):
File "<string>", line 2, in <module>
TypeError: 'list' object is not callable
関数の場合と同様に、末尾の括弧のペアがその実行をトリガーできる場合、オブジェクトは呼び出し可能と見なされます。
幸い、Python 標準には、オブジェクトが呼び出し可能であると思われる場合は True を返し、オブジェクトが呼び出し可能でない場合は False を返す callable() 関数も用意されています。
上記のリストの例では、オブジェクトは呼び出し可能ではないため、False を確実に取得します。
nums = [23, 34, 56, 67]
print(callable(nums))
出力:
False
関数、メソッド、およびクラスは Python で呼び出し可能です。
これは、実行演算子を使用して実行を呼び出すことができるためです。Python の呼び出し可能オブジェクトのリストには、ラムダ関数とカスタム定義の呼び出し可能オブジェクトが含まれています。
一方、タプル、リスト、辞書などのデータ型は呼び出し可能ではありません。したがって、Python で通常の関数またはメソッドとしてそれらを実行しようとすると、TypeError: object is not callable という結果になります。
list object not callable は、角括弧の代わりに括弧を使ってリストの要素にインデックスを付けるときにも発生します。
ほとんどのプログラミング言語では、角かっこはデフォルトのインデックス演算子と見なされます。ただし、プログラムを作成する際には、よく似ているため、角かっこの代わりにかっこを使用することがよくあります。
以下のコードスニペットは、リストのインデックス 2 にある要素を返すことを目的としています。
cars = ["Mazda", "Toyota", "BMW", "Tesla", "Hyundai"]
print(cars(2))
出力:
Traceback (most recent call last):
File "<string>", line 2, in <module>
TypeError: 'list' object is not callable
初心者はこの間違いを犯すことがよくありますが、経験豊富な開発者でさえも犯す一般的な構文エラーでもあります。このエラーは、以下に示すように、括弧の代わりに角かっこを使用して要素にインデックスを付けることで解決できます。
cars = ["Mazda", "Toyota", "BMW", "Tesla", "Hyundai"]
print(cars[2])
出力:
BMW
リスト内包表記を使用して Python 構文を短縮する場合、角括弧の代わりに括弧を使用してインデックスを作成する可能性があります。これは、リスト内包表記には、通常の Python 構文とは対照的に、複数の角括弧と括弧の組み合わせが含まれるためです。
以下の例では、リスト内包表記を作成する際に括弧が誤用されています。
top_companies = [
["microsoft", "apple", "ibm"],
["tesla", "lucid", "nikola"],
["foxcon", "huawei", "tencent"],
]
result = [[row(index).upper() for index in range(len(row))] for row in top_companies]
print(result)
出力:
Traceback (most recent call last):
File "<string>", line 2, in <module>
File "<string>", line 2, in <listcomp>
File "<string>", line 2, in <listcomp>
TypeError: 'list' object is not callable
上記の例では、要素のインデックスを使用してネストされたリストを反復処理し、その要素を大文字に変換することを目的としています。エラーを解決するには、以下に示すように、コードを調べて、インデックスに角かっこを使用していることを確認する必要があります。
top_companies = [
["microsoft", "apple", "ibm"],
["tesla", "lucid", "nikola"],
["foxcon", "huawei", "tencent"],
]
result = [[row[index].upper() for index in range(len(row))] for row in top_companies]
print(result)
出力:
[['MICROSOFT', 'APPLE', 'IBM'], ['TESLA', 'LUCID', 'NIKOLA'], ['FOXCON', 'HUAWEI', 'TENCENT']]
TypeError: list object is not callable は、事前定義された名前を使用して変数に名前を付けるときにも発生する可能性があります。このような種類のエラーを引き起こす可能性のある、最も一般的に誤用される組み込み名には、次のものがあります。str、dict、list、および range。
Python では、リストコンストラクターlist() を使用して新しいリストを作成します。これは事前定義された組み込み名であり、Python リストを表すクラスオブジェクトであるため、名前リストを変数名として使用するのは適切ではありません。
名前リストを使用して変数に名前を付けると、次の例に示すように、リストオブジェクトを呼び出すことができませんというエラーが発生する可能性があります。
list = [24, 24, 25, 26, 28, 56]
nums_range = list(range(20, 40))
for number in list:
if number in nums_range:
print(number, "is the range")
else:
print(number, "number is not in range")
出力:
Traceback (most recent call last):
File "<string>", line 3, in <module>
TypeError: 'list' object is not callable
上記の例では、事前定義された名前リストを変数名として使用しました。コンストラクターと同じ名前を使用して、2 行目に新しいリストを作成しようとします。
この名前はすでに変数名として使用されているため、Python は 2 行目をリストオブジェクトを呼び出そうとしていると解釈し、エラーが発生します。
上記のエラーは、リストオブジェクトの名前を別の名前に変更することで解決できます。新しい名前は、list() コンストラクターがその機能プロパティを保持することを保証するため、キーワードであってはなりません。
nums = [23, 24, 25, 28, 27, 35, 78]
nums_range = list(range(20, 40))
for number in nums:
if number in nums_range:
print(number, "is the range")
else:
print(number, "is not in the range")
出力:
23 is the range
24 is the range
25 is the range
28 is the range
27 is the range
35 is the range
78 is not in the range