Quels types d'objets entrent dans le domaine des "indices"?
python
terminology
Alistair
la source
la source
hasattr(SomeClassWithoutGetItem, '__getitem__')
pour déterminer si une chose est indicible?[
...]
est appelée indice , car elle équivaut à la notation mathématique qui utilise des indices réels; par exemple,a[1]
est Python pour ce que les mathématiciens écriraient comme a₁ . Ainsi, "souscriptible" signifie "pouvant être souscrit". Ce qui, en termes Python, signifie qu'il doit être implémenté__getitem__()
, car il nea[1]
s'agit que de sucre syntaxique poura.__getitem__(1)
.hasattr
devrait bien fonctionner, mais ce n'est pas la façon Pythonique de faire les choses; La pratique de Python encourage Duck Typing . Autrement dit, si vous prévoyez d'essayer de récupérer un élément de votre objet à l'aide d'un indice, allez-y et faites-le; si vous pensez que cela peut ne pas fonctionner parce que l'objet n'est pas indexable, enveloppez-le dans untry
bloc avec unexcept TypeError
.Sur le dessus de ma tête, ce qui suit sont les seuls éléments intégrés qui sont indexables:
Mais la réponse de mipadi est correcte - toute classe qui implémente
__getitem__
est indicablela source
Un objet scriptable est un objet qui enregistre les opérations qui lui sont effectuées et il peut les stocker sous forme de "script" qui peut être rejoué.
Par exemple, voir: Application Scripting Framework
Maintenant, si Alistair ne savait pas ce qu'il demandait et signifiait vraiment des objets "indexables" (tels que modifiés par d'autres), alors (comme Mipadi a également répondu), c'est le bon:
Un objet indexable est tout objet qui implémente la
__getitem__
méthode spéciale (listes de réflexion, dictionnaires).la source
La signification de l'indice dans l'informatique est: "un symbole (écrit théoriquement comme un indice mais en pratique généralement pas) utilisé dans un programme, seul ou avec d'autres, pour spécifier l'un des éléments d'un tableau."
Maintenant, dans l'exemple simple donné par @ user2194711, nous pouvons voir que l'élément ajouté ne peut pas faire partie de la liste pour deux raisons: -
1) Nous n'appelons pas vraiment la méthode append; car il doit l'
()
appeler.2) L'erreur indique que la fonction ou la méthode n'est pas indexable; signifie qu'ils ne sont pas indexables comme une liste ou une séquence.
Maintenant, voyez ceci: -
Cela signifie qu'il n'y a pas d'indices ou de dire des éléments
function
comme ils se produisent dans les séquences; et nous ne pouvons pas y accéder comme nous le faisons, avec l'aide de[]
.Aussi; comme l'a dit mipadi dans sa réponse; Cela signifie essentiellement que l'objet implémente la
__getitem__()
méthode. (s'il est indexable). Ainsi l'erreur a produit:la source
J'ai eu ce même problème. je faisais
Donc, l'utilisation
[
provoquait une erreur. Ça devrait êtrearr.append("HI")
la source
En corollaire aux réponses précédentes, il s'agit très souvent d'un signe que vous pensez avoir une liste (ou dict, ou autre objet indicable) lorsque vous n'en avez pas.
Par exemple, supposons que vous ayez une fonction qui devrait renvoyer une liste;
Maintenant, lorsque vous appelez cette fonction, et
something_happens()
pour une raison quelconque, elle ne renvoie pas deTrue
valeur, que se passe-t-il? L'if
échec, et donc vous tombez;gimme_things
ne fait rien explicitementreturn
- alors en fait, ce sera implicitementreturn None
. Alors ce code:échouera avec "l'
NoneType
objet n'est pas indexable" parce que, eh bien,things
c'estNone
et donc vous essayez de faireNone[0]
ce qui n'a pas de sens parce que ... ce que dit le message d'erreur.Il existe deux façons de corriger ce bogue dans votre code - la première consiste à éviter l'erreur en vérifiant qu'elle
things
est en fait valide avant de tenter de l'utiliser;ou piéger de manière équivalente l'
TypeError
exception;Une autre consiste à repenser
gimme_things
afin de vous assurer qu'il renvoie toujours une liste. Dans ce cas, c'est probablement la conception la plus simple car cela signifie que s'il existe de nombreux endroits où vous avez un bug similaire, ils peuvent rester simples et idiomatiques.Bien sûr, ce que vous mettez dans la
else:
branche dépend de votre cas d'utilisation. Peut-être devriez-vous lever une exception en cas d'something_happens()
échec, pour rendre plus évident et explicite où quelque chose s'est mal passé? Ajouter des exceptions à votre propre code est un moyen important de vous faire savoir exactement ce qui se passe quand quelque chose échoue!(Remarquez également que ce dernier correctif ne corrige toujours pas complètement le bogue - il vous empêche de tenter d'indexer
None
maisthings[0]
est toujours unIndexError
quandthings
est une liste vide. Si vous en avez un,try
vous pouvez également leexcept (TypeError, IndexError)
piéger.)la source