Python >> Tutoriel Python >  >> Python

Python TypeError :l'objet n'est pas inscriptible (comment résoudre ce bogue stupide)

Rencontrez-vous cette erreur stupide ?

Vous n'êtes pas seul - des milliers de codeurs comme vous génèrent cette erreur dans des milliers de projets chaque mois. Ce court tutoriel vous montrera exactement pourquoi cette erreur se produit, comment la corriger et comment ne plus jamais refaire la même erreur. Alors, commençons !

Python lance le TypeError object is not subscriptable si vous utilisez l'indexation avec la notation entre crochets sur un objet qui n'est pas indexable. C'est le cas si l'objet ne définit pas le __getitem__() méthode. Vous pouvez le corriger en supprimant l'appel d'indexation ou en définissant le __getitem__ méthode.

L'extrait de code suivant montre l'exemple minimal qui conduit à l'erreur :

variable = None
print(variable[0])
# TypeError: 'NoneType' object is not subscriptable

Vous définissez le variable à la valeur None . La valeur None n'est pas un objet conteneur, il ne contient pas d'autres objets. Donc, le code n'a vraiment aucun sens. Quel résultat attendez-vous de l'opération d'indexation ?

Exercice  :Avant de vous montrer comment résoudre ce problème, essayez de résoudre l'erreur vous-même dans le shell interactif suivant :

Si vous rencontrez des difficultés avec l'indexation en Python, consultez les articles suivants sur le blog Finxter, en particulier le troisième !

Articles connexes :

  • Indexation en Python
  • Découpage en Python
  • Fortement recommandé :Accéder à l'index des itérables en Python

Notez qu'un problème similaire se pose si vous définissez la variable sur la valeur entière 42 au lieu du None évaluer. La seule différence est que le message d'erreur est maintenant "TypeError: 'int' object is not subscriptable" .

Vous pouvez corriger le TypeError non inscriptible en enveloppant les valeurs non indexables dans un type de données de conteneur tel qu'une liste en Python :

variable = [None]
print(variable[0])
# None

La sortie est maintenant la valeur None et le script ne génère plus d'erreur.

Une alternative est de définir le __getitem__ méthode dans votre code :

class X:
    def __getitem__(self, i):
        return f"Value {i}"

variable = X()
print(variable[0])
# Value 0

Vous écrasez le __getitem__ méthode qui prend un argument (index) i (en plus de l'obligatoire self argument) et renvoie le i -ième valeur du « conteneur ». Dans notre cas, nous renvoyons simplement une chaîne "Value 0" pour l'élément variable[0] et "Value 10" pour l'élément variable[10] . Cela n'a pas beaucoup de sens ici, mais c'est l'exemple minimal qui montre comment cela fonctionne.

J'espère que vous pourrez corriger le bogue dans votre code ! Avant de partir, consultez nos feuilles de triche Python gratuites qui vous apprendra les bases de Python en un minimum de temps :

Humour de programmation – Python