Fehler listenobjekt in Python nicht aufrufbar behoben

Isaac Tony 12 April 2022
Fehler listenobjekt in Python nicht aufrufbar behoben

Typfehler sind einige der häufigsten Standardausnahmen in Python-Programmen. Sie resultieren häufig aus der Nichteinhaltung der korrekten Syntax oder einer Operation mit einem nicht unterstützten Datentyp.

Dieser Fehler tritt häufig auf, wenn versucht wird, ein nicht aufrufbares Objekt so aufzurufen, wie wir es mit einem normalen Funktionsobjekt tun würden. Das folgende Code-Snippet gibt einen TypeError aufgrund der Verletzung der korrekten Python-Syntax zurück.

nums = [23, 34, 56, 67]
nums()

Ausgabe:

Traceback (most recent call last):
  File "<string>", line 2, in <module>
TypeError: 'list' object is not callable

Ein Objekt gilt als aufrufbar, wenn ein abschließendes Klammerpaar seine Ausführung auslösen kann, wie bei Funktionen.

Glücklicherweise bietet der Python-Standard auch die Funktion callable(), die True zurückgibt, wenn ein Objekt aufrufbar erscheint, und False, wenn ein Objekt nicht aufrufbar ist.

Im Beispiel über der Liste ist das Objekt nicht aufrufbar, und daher würden wir sicherlich ein False erhalten.

nums = [23, 34, 56, 67]
print(callable(nums))

Ausgabe:

False

Funktionen, Methoden und Klassen sind Callables in Python.

Dies liegt daran, dass ihre Ausführung mit dem Ausführungsoperator aufgerufen werden kann. Die Liste der aufrufbaren Objekte in Python umfasst Lambda-Funktionen und benutzerdefinierte aufrufbare Objekte.

Datentypen wie Tupel, Listen und Wörterbücher sind dagegen nicht aufrufbar. Daher würde jeder Versuch, sie als normale Funktionen oder Methoden in Python auszuführen, zu einem TypeError: object is not callable führen.

Der nicht aufrufbare TypeError list-Objekt kann auch bei der Indexierung von Elementen aus Listen mit runden statt eckigen Klammern auftreten.

In den meisten Programmiersprachen gelten eckige Klammern als Standard-Indizierungsoperatoren. Beim Schreiben von Programmen werden wir jedoch oft feststellen, dass wir aufgrund ihrer großen Ähnlichkeit runde Klammern anstelle von eckigen Klammern verwenden.

Das folgende Code-Snippet soll das Element an Index zwei in der Liste zurückgeben.

cars = ["Mazda", "Toyota", "BMW", "Tesla", "Hyundai"]
print(cars(2))

Ausgabe:

Traceback (most recent call last):
  File "<string>", line 2, in <module>
TypeError: 'list' object is not callable

Obwohl Anfänger diesen Fehler oft machen, ist es auch ein häufiger syntaktischer Fehler, der sogar von erfahrenen Entwicklern begangen wird. Dieser Fehler kann behoben werden, indem einfach eckige Klammern anstelle von runden Klammern verwendet werden, um Elemente zu indizieren, wie unten gezeigt.

cars = ["Mazda", "Toyota", "BMW", "Tesla", "Hyundai"]
print(cars[2])

Ausgabe:

BMW

Die Verwendung von Klammern zur Indizierung anstelle von eckigen Klammern tritt wahrscheinlich auf, wenn das Listenverständnis verwendet wird, um die Python-Syntax zu verkürzen. Dies liegt daran, dass Listenverständnisse im Gegensatz zur üblichen Python-Syntax eine Kombination aus mehreren eckigen Klammern und runden Klammern beinhalten.

Im folgenden Beispiel wurden Klammern beim Erstellen des Listenverständnisses missbraucht.

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)

Ausgabe:

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

Das obige Beispiel beabsichtigt, die verschachtelten Listen unter Verwendung der Indizes der Elemente zu durchlaufen und seine Elemente in Großbuchstaben umzuwandeln. Um den Fehler zu beheben, müssen wir den Code untersuchen und sicherstellen, dass wir eckige Klammern zum Indexieren verwenden, wie unten gezeigt.

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)

Ausgabe:

[['MICROSOFT', 'APPLE', 'IBM'], ['TESLA', 'LUCID', 'NIKOLA'], ['FOXCON', 'HUAWEI', 'TENCENT']]

TypeError: list object is not callable kann auch auftreten, wenn ein vordefinierter Name zum Benennen einer Variablen verwendet wird. Zu den am häufigsten missbrauchten eingebauten Namen, die einen solchen Fehler hervorrufen könnten, gehören: str, dict, list und range.

In Python wird der Listenkonstruktor list() verwendet, um neue Listen zu erstellen. Da dies ein vordefinierter eingebauter Name und ein Klassenobjekt ist, das eine Python-Liste darstellt, ist es nicht gut, die Namensliste als Variablennamen zu verwenden.

Die Verwendung der Namensliste zur Namensvariablen könnte zu dem Fehler list object is not callable führen, wie im folgenden Beispiel gezeigt.

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")

Ausgabe:

Traceback (most recent call last):
  File "<string>", line 3, in <module>
TypeError: 'list' object is not callable

Im obigen Beispiel haben wir die vordefinierte Namensliste als Variablennamen verwendet. Wir versuchen, denselben Namen als Konstruktor zu verwenden, um eine neue Liste in der zweiten Zeile zu erstellen.

Da wir diesen Namen bereits als Variablennamen verwendet hatten, interpretiert Python die zweite Zeile als Versuch, das Listenobjekt aufzurufen, was zu einem Fehler führt.

Der obige Fehler kann behoben werden, indem das Listenobjekt in einen anderen Namen umbenannt wird. Der neue Name sollte kein Schlüsselwort sein, da er dafür sorgt, dass der Konstruktor list() seine funktionalen Eigenschaften behält.

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")

Ausgabe:

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
Autor: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.

LinkedIn

Verwandter Artikel - Python List

Verwandter Artikel - Python Object

Verwandter Artikel - Python Error