Cours
En Python, un message d’erreur fréquent est le suivant :
'builtin_function_or_method' object is not subscriptable
Python lève cette erreur lorsqu’une fonction ou une méthode est suivie de crochets []. Or, les fonctions sont des objets appelables. Elles nécessitent donc des parenthèses (), parfois aussi appelées parenthèses rondes.
Voyons un exemple où Python déclenche cette erreur :
numbers = [2, 4, 6, 8]
numbers.append[10]
Traceback (most recent call last):
...
TypeError: 'builtin_function_or_method' object is not subscriptable
La section suivante examine cette erreur plus en détail.
Comprendre l’erreur
Les fonctions Python sont des objets appelables, ce qui signifie que l’on utilise des parenthèses après leur nom pour exécuter le code de leur définition. L’un des exemples les plus courants de fonction intégrée en Python est print() :
print("This is a built-in function")
This is a built-in function
On utilise des parenthèses pour appeler une fonction en Python. En revanche, utiliser des crochets à la place déclenche une erreur :
print["This is a built-in function"]
Traceback (most recent call last):
...
TypeError: 'builtin_function_or_method' object is not subscriptable
Décomposons le message d’erreur en ses éléments clés :
- Un objet 'builtin_function_or_method'
- Non subscriptable
Dans l’exemple ci-dessus, print() est une fonction intégrée. La description mentionne aussi les méthodes, qui sont des fonctions rattachées à une classe. Python propose de nombreuses méthodes intégrées associées à ses types de données. Voici un autre exemple qui génère ce message d’erreur :
name = "DataCamp"
print(name.count["a"])
Traceback (most recent call last):
...
TypeError: 'builtin_function_or_method' object is not subscriptable
La méthode .count(), comme toutes les fonctions, nécessite des parenthèses :
print(name.count("a"))
3
Ce cas est similaire à l’exemple de l’introduction, qui utilisait la méthode de liste .append(). Voici la version correcte avec des parenthèses :
numbers = [2, 4, 6, 8]
numbers.append(10)
print(numbers)
[2, 4, 6, 8, 10]
TypeError: 'function' object is not subscriptable
Python lève une erreur similaire avec les fonctions définies par l’utilisateur :
def greet_person(name):
print(f"Hello {person}")
greet_person["James"]
Traceback (most recent call last):
...
TypeError: 'function' object is not subscriptable
Cependant, la fonction greet_person() n’est pas une fonction intégrée de Python. Le message d’erreur précise donc qu’il s’agit d’un 'function' et non d’un 'builtin_function_or_method'.
La seconde partie du message fait référence au terme « subscriptable ». Un objet Python est subscriptable si l’on peut utiliser des crochets pour accéder à l’un de ses éléments. Un exemple courant d’objet subscriptable est une séquence, que l’on peut indexer avec des crochets :
print(numbers[0])
print(numbers[-1])
print(numbers[1:4])
2
10
[4, 6, 8]
Les tuples et les chaînes de caractères sont d’autres exemples de séquences. Ils sont donc aussi subscriptables :
more_numbers = 10, 30, 50
print(more_numbers[0])
name = "DataCamp"
print(name[0])
10
'D'
Les mappings Python sont également subscriptables. Le mapping le plus courant est le dictionnaire :
points = {"James": 10, "Mary": 14}
print(points["Mary"])
14
On utilise les clés du dictionnaire au lieu d’indices à l’intérieur des crochets.
Python : appelable vs subscriptable
Les séquences et les mappings sont des exemples d’objets Python subscriptables. On peut utiliser des crochets après le nom de l’objet pour accéder à un élément de la structure de données. Une classe Python crée des objets subscriptables si elle définit la méthode spéciale .__getitem__().
Les fonctions et les méthodes sont des objets appelables. On utilise des parenthèses après leur nom pour les appeler. Appeler une fonction ou une méthode exécute le code de sa définition.
Les classes sont un autre type d’objet Python appelable. Appeler une classe crée une instance. De manière générale, un objet Python est appelable si sa classe définit la méthode spéciale .__call__().
Python lève un message d’erreur similaire lorsque l’on tente d’appeler un objet qui n’est pas appelable :
numbers = [2, 4, 6, 8]
print(numbers(0))
Traceback (most recent call last):
...
TypeError: 'list' object is not callable
La variable numbers est une liste, qui n’est pas appelable. La bonne manière d’accéder au premier élément de la liste est d’utiliser des crochets : numbers[0]. Les fonctions, les méthodes et les classes sont les objets appelables les plus courants en Python.
Corriger l’erreur 'builtin_function_or_method' object is not subscriptable
Python lève l’exception ``'builtin_function_or_method' object is not subscriptable` lorsqu’une fonction ou une méthode est suivie de crochets. Repérez les crochets placés juste après le nom de la fonction ou de la méthode et remplacez-les par des parenthèses.
Dans certains cas, une fonction ou une méthode prend en argument une liste, définie avec des crochets. Notez toutefois que cette liste est fournie à l’intérieur de parenthèses :
number_of_values = len([10, 30, 50])
print(number_of_values)
numbers = [2, 4, 6, 8]
numbers.extend([10, 12])
print(numbers)
3
[2, 4, 6, 8, 10, 12]
Dans ces exemples, le nom de la fonction ou de la méthode est suivi de parenthèses. L’argument entre parenthèses est une liste. La notation avec crochets pour définir une liste diffère de la notation avec crochets utilisée avec les séquences, les mappings et autres objets subscriptables.
Conseils de débogage
Vous pouvez, par exemple, vérifier le type de l’objet avec la fonction intégrée type() :
print(type(print))
numbers = [2, 4, 6, 8]
print(type(numbers.append))
<class 'builtin_function_or_method'>
La sortie confirme qu’il s’agit d’une fonction ou d’une méthode intégrée, donc appelable. Il existe aussi une fonction intégrée appelée callable() qui renvoie True si son argument est appelable :
print(callable(numbers.append))
True
Autres conseils de débogage à considérer :
- Vérifiez le type de délimiteurs utilisés (crochets ou parenthèses). Les objets appelables, comme les fonctions et les méthodes, doivent être suivis de parenthèses. Les crochets servent aux séquences, aux mappings et aux autres objets subscriptables.
- Repérez dans le message d’erreur les indices concernant les fonctions ou méthodes intégrées et les objets subscriptables. Le numéro de ligne indiqué pointe vers l’emplacement de l’erreur.
Conclusion
Les langages de programmation comme Python utilisent des symboles distincts pour des usages différents. Les crochets s’emploient immédiatement après le nom d’un objet pour accéder à un élément d’une structure de données. Cette notation fonctionne sur les objets subscriptables. Les crochets servent aussi à créer des listes lorsqu’ils ne suivent pas immédiatement un nom d’objet.
Les parenthèses s’utilisent après le nom d’un objet pour l’appeler. Les fonctions et les méthodes sont des exemples d’objets appelables en Python. Les parenthèses sont également associées aux tuples, et servent à regrouper des parties d’une instruction si nécessaire.
Python lève l’exception 'builtin_function_or_method' object is not subscriptable lorsqu’une fonction ou méthode intégrée est suivie de crochets. La bonne manière d’appeler une fonction ou une méthode est d’utiliser des parenthèses.
Pour en savoir plus sur les fonctions, consultez l’article de DataCamp Python Functions: How to Call & Write Functions.
J'ai étudié la physique et les mathématiques au niveau UG à l'université de Malte. J'ai ensuite déménagé à Londres et obtenu un doctorat en physique à l'Imperial College. J'ai travaillé sur de nouvelles techniques optiques pour obtenir des images de la rétine humaine. Aujourd'hui, je me concentre sur l'écriture, la communication et l'enseignement de Python.
