Correction d'un objet de liste d'erreurs non appelable en Python

Isaac Tony 12 avril 2022
Correction d'un objet de liste d'erreurs non appelable en Python

Les erreurs de type font partie des exceptions standard courantes dans les programmes Python. Ils résultent souvent du non-respect de la syntaxe correcte ou d’une opération sur un type de données non pris en charge.

Cette erreur survient souvent lorsque l’on tente d’appeler un objet non appelable comme nous appellerions un objet fonction normal. L’extrait de code ci-dessous renvoie une TypeError en raison de la violation de la syntaxe python correcte.

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

Production :

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

Un objet est considéré comme appelable si une paire de parenthèses à la fin peut déclencher son exécution, comme pour les fonctions.

Heureusement, le standard Python fournit également la fonction callable() qui renvoie True si un objet apparaît appelable et False si un objet ne l’est pas.

Dans l’exemple au-dessus de la liste, l’objet n’est pas appelable, et donc nous obtiendrions certainement un False.

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

Production :

False

Les fonctions, les méthodes et les classes sont appelables en Python.

En effet, leur exécution peut être invoquée à l’aide de l’opérateur d’exécution. La liste des objets appelables en Python comprend des fonctions lambda et des objets appelables personnalisés.

Les types de données tels que les tuples, les listes et les dictionnaires, en revanche, ne peuvent pas être appelés. Par conséquent, toute tentative de les exécuter en tant que fonctions ou méthodes normales en Python entraînerait une TypeError: object is not callable.

L’objet TypeError list qui n’est pas appelable peut également survenir lors de l’indexation d’éléments de listes à l’aide de parenthèses au lieu de crochets.

Dans la plupart des langages de programmation, les crochets sont considérés comme les opérateurs d’indexation par défaut. Cependant, lors de l’écriture de programmes, nous pouvons souvent nous retrouver à utiliser des parenthèses à la place des crochets en raison de leur grande ressemblance.

L’extrait de code ci-dessous est destiné à renvoyer l’élément à l’index deux dans la liste.

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

Production :

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

Bien que les novices commettent souvent cette erreur, il s’agit également d’une erreur syntaxique courante commise par des développeurs même expérimentés. Cette erreur peut être résolue en utilisant simplement des crochets pour indexer les éléments au lieu des parenthèses, comme indiqué ci-dessous.

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

Production :

BMW

L’utilisation de parenthèses pour effectuer l’indexation au lieu de crochets est susceptible de se produire lors de l’utilisation de la compréhension de liste pour raccourcir la syntaxe Python. En effet, les compréhensions de liste impliquent une combinaison de plusieurs crochets et parenthèses par opposition à la syntaxe Python habituelle.

Dans l’exemple ci-dessous, les parenthèses ont été mal utilisées dans la construction de la compréhension de la liste.

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)

Production :

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

L’exemple ci-dessus vise à parcourir les listes imbriquées en utilisant les index des éléments et à convertir ses éléments en majuscules. Pour résoudre l’erreur, nous devons inspecter le code et nous assurer que nous utilisons des crochets pour indexer, comme indiqué ci-dessous.

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)

Production :

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

TypeError: list object is not callable peut également être rencontré lorsqu’un nom prédéfini est utilisé pour nommer une variable. Certains des noms intégrés les plus couramment utilisés à mauvais escient qui pourraient provoquer une erreur de ce type incluent; str, dict, list et range.

En Python, le constructeur de liste list() est utilisé pour créer de nouvelles listes. Puisqu’il s’agit d’un nom intégré prédéfini et d’un objet de classe représentant une liste Python, il n’est pas bon d’utiliser la liste de noms comme nom de variable.

L’utilisation de la liste de noms pour nommer la variable peut entraîner l’erreur list object is not callable, comme indiqué dans l’exemple ci-dessous.

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

Production :

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

Nous avons utilisé la liste de noms prédéfinie comme nom de variable dans l’exemple ci-dessus. Nous essayons d’utiliser le même nom qu’un constructeur pour créer une nouvelle liste dans la deuxième ligne.

Comme nous avions déjà utilisé ce nom comme nom de variable, Python interprète la deuxième ligne comme une tentative d’appel de l’objet liste, ce qui entraîne une erreur.

L’erreur ci-dessus peut être résolue en renommant l’objet de liste avec un nom différent. Le nouveau nom ne doit pas être un mot-clé puisqu’il garantit que le constructeur list() conserve ses propriétés fonctionnelles.

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

Production :

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
Auteur: 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

Article connexe - Python List

Article connexe - Python Object

Article connexe - Python Error