Vous essayez de récupérer des données d’un objet et vous voyez une erreur « object is not subscriptable » à la place ? Le problème est que vous indexez le mauvais type de données.
Découvrez tout ce qu’il faut savoir sur les types d’indices et sur la manière de résoudre cette erreur.
Que signifie « Subscriptable » en Python ?
Le terme « subscriptable » en Python désigne un type de données qui stocke plusieurs valeurs auxquelles vous pouvez accéder individuellement. Il est possible d’accéder à une valeur spécifique d’un type de données subscriptible par l’intermédiaire de son index, en utilisant des crochets ([]).
Si vous essayez d’accéder aux éléments d’un type de données qui n’est pas indexable, Python lève une exception « TypeError : object is not subscriptable ».
Les types de données suivants sont inscriptibles en Python : les listes, les chaînes, les tuples et les dictionnaires.
list_example = [1, 3, 5, "Idowu"]
string_example = "Idowu Omisola"
tuple_example = (1, 3, 5, "Idowu")
dict_example = {"name": "Idowu", "Language": "Yoruba"}
print(list_example[0]) # 1
print(string_example[3]) # w
print(tuple_example[1]) # 3
print(dict_example["name"]) # Idowu
Cependant, les ensembles, les entiers, les flottants et les booléens sont inaccessibles via l’indexation, et ne peuvent donc pas être souscrits :
float_example = 12.45
int_example = 12367
bool_example = True
set_example = {1, 3, 5, "Python"}
print(float_example[1])
print(bool_example[2])
print(int_example[2])
print(set_example[2])
La tentative d’exécution de chacune de ces instructions génère l’exception « object is not subscriptable » :
Résolution de l’exception
La résolution de l’exception « object is not subscriptable » est plus facile une fois que vous comprenez les règles d’accès à chaque type de données. Commencez donc votre débogage Python en vérifiant le type de données de l’objet que vous essayez d’indexer.
float_example = 12.45
int_example = 12367
bool_example = True
set_example = {1, 3, 5, "Python"}
print(type(float_example)) # <class 'float'>
print(type(int_example)) # <class 'int'>
print(type(bool_example)) # <class 'bool'>
print(type(set_example)) # <class 'set'>
Une fois que vous avez déterminé que le type de données n’est pas subscriptible, le convertir en un type indexable résout le problème. C’est pratique si les données proviennent d’une API tierce. La conversion de types de données tels que les entiers, les flottants et les booléens en chaînes de caractères les rend inscriptibles :
print(str(float_example)[:2]) # 12
print(str(int_example)[:2]) # 12
print(str(bool_example)[:2]) # Tr
Vous pouvez même manipuler les chaînes Python résultantes comme vous le souhaitez. Si vous avez affaire à des entiers et des flottants, vous voudrez peut-être conserver le type de données d’origine dans la sortie. Pour ce faire, convertissez les valeurs résultantes dans leur type de données d’origine après les avoir indexées en tant que chaînes :
converted_float = float(str(float_example)[:2])
converted_int = int(str(int_example)[:2])
# 12.0 Data type:<class 'float'>
print(converted_float, f'Data type:{type(converted_float)}')
# 12 Data type:<class 'int'>
print(converted_int, f'Data type:{type(converted_int)}')
Quant à un ensemble, vous pouvez le transformer en liste. Bien que vous puissiez convertir un objet set en liste à l’aide de la fonction list(set) Python one-liner, ceci ne préserve pas les positions des éléments dans la liste résultante. Pour être sûr d’obtenir une liste dont les positions des éléments sont préservées, utilisez la fonction lambda de Python comme suit :
set_example = {1, 3, 5, "Python"}
converted = sorted(set_example, key=lambda x: (isinstance(x, str), x))
print(converted[3]) # Python
Maîtriser le débogage en Python
Python a une courbe d’apprentissage douce. Mais de simples exceptions peuvent vous déconcerter si vous ne savez pas comment vous y prendre. Apprendre à déboguer son code et prendre son temps pour résoudre les problèmes permet de corriger les erreurs de codage et les exceptions de Python.