¿Qué tipos de objetos caen en el dominio de "subcriptable"?
python
terminology
Alistair
fuente
fuente
hasattr(SomeClassWithoutGetItem, '__getitem__')
determinar si una cosa es subcriptable?[
...]
sintaxis de la indexación se llama un subíndice , porque es equivalente a la notación matemática que utiliza subíndices reales; Por ejemplo,a[1]
Python es lo que los matemáticos escribirían como a₁ . Entonces "subscriptable" significa "capaz de ser subcripted". Lo cual, en términos de Python, significa que tiene que implementarse__getitem__()
, ya quea[1]
es solo azúcar sintáctico paraa.__getitem__(1)
.hasattr
debería funcionar bien, pero no es la forma pitónica de hacer las cosas; La práctica de Python anima a Duck Typing . Es decir, si planea intentar obtener un elemento de su objeto utilizando un subíndice, continúe y hágalo; Si cree que podría no funcionar porque el objeto no es subcriptable, envuélvalo en untry
bloque con unexcept TypeError
.Fuera de mi cabeza, las siguientes son las únicas incorporadas que son subscriptables:
Pero la respuesta de mipadi es correcta: cualquier clase que implemente
__getitem__
es subscriptablefuente
Un objeto programable es un objeto que registra las operaciones que se le realizan y puede almacenarlos como un "script" que puede reproducirse.
Por ejemplo, consulte: Marco de secuencias de comandos de aplicaciones
Ahora, si Alistair no sabía lo que preguntaba y realmente quería decir objetos "subscriptables" (tal como lo editaron otros), entonces (como también respondió mipadi) este es el correcto:
Un objeto subscriptable es cualquier objeto que implementa el
__getitem__
método especial (listas de reflexión, diccionarios).fuente
El significado del subíndice en informática es: "un símbolo (escrito nocionalmente como subíndice pero en la práctica generalmente no) usado en un programa, solo o con otros, para especificar uno de los elementos de una matriz".
Ahora, en el ejemplo simple dado por @ user2194711 , podemos ver que el elemento adjunto no puede ser parte de la lista debido a dos razones:
1) Realmente no estamos llamando al método append; porque necesita
()
llamarlo2) El error indica que la función o método no es subscriptable; significa que no son indexables como una lista o secuencia.
Ahora mira esto: -
Eso significa que no hay subíndices o dicen elementos
function
como si ocurrieran en secuencias; y no podemos acceder a ellos como lo hacemos, con la ayuda de[]
.También; como dijo mipadi en su respuesta; Básicamente significa que el objeto implementa el
__getitem__()
método. (si es subscriptable). Así el error producido:fuente
Tuve el mismo problema. estaba haciendo
Entonces usar
[
estaba causando un error. Debería serarr.append("HI")
fuente
Como corolario de las respuestas anteriores aquí, muy a menudo es una señal de que crees que tienes una lista (o dict, u otro objeto suscriptable) cuando no la tienes.
Por ejemplo, supongamos que tiene una función que debería devolver una lista;
Ahora, cuando llama a esa función, y
something_happens()
por alguna razón no devuelve unTrue
valor, ¿qué sucede? Elif
falla, y entonces caes;gimme_things
no hace nada explícitamentereturn
, entonces, de hecho, lo hará implícitamentereturn None
. Entonces este código:fallará con "el
NoneType
objeto no es subscriptible" porque, bueno, sí lothings
estáNone
y está intentando hacerloNone[0]
lo que no tiene sentido porque ... lo que dice el mensaje de error.Hay dos formas de corregir este error en su código: la primera es evitar el error comprobando que
things
sea válido antes de intentar usarlo;o equivalentemente atrapar la
TypeError
excepción;Otra es rediseñar
gimme_things
para asegurarse de que siempre devuelva una lista. En este caso, ese es probablemente el diseño más simple porque significa que si hay muchos lugares donde tiene un error similar, pueden mantenerse simples e idiomáticos.Por supuesto, lo que pones en la
else:
rama depende de tu caso de uso. ¿Quizás debería plantear una excepción cuandosomething_happens()
falla, para que sea más obvio y explícito dónde algo salió mal? ¡Agregar excepciones a su propio código es una forma importante de hacerse saber exactamente qué sucede cuando algo falla!(Observe también cómo esta última solución todavía no soluciona completamente el error: evita que intente subíndice
None
perothings[0]
sigue siendo unIndexError
cuándothings
es una lista vacía. Si tiene unatry
, puede hacerexcept (TypeError, IndexError)
para atraparla también).fuente