in

Terminología: ¿Qué significa si un objeto Python es «subíndice» o no?

apple touch icon@2

Como corolario de las respuestas anteriores aquí, muy a menudo esto es una señal de que cree que tiene una lista (o dict, u otro objeto con subíndice) cuando no la tiene.

Por ejemplo, digamos que tiene una función que deberían devolver una lista;

def gimme_things():
    if something_happens():
        return ['all', 'the', 'things']

Ahora, cuando llamas a esa función, y something_happens() por alguna razón no devuelve un True valor, que pasa? los if fracasa, y así fracasas; gimme_things no explícitamente return cualquier cosa, entonces, de hecho, implícitamente return None. Entonces este código:

things = gimme_things()
print("My first thing is {0}".format(things[0]))

fallará con «NoneType el objeto no se puede suscribir «porque, bueno, things es None y entonces estas tratando de hacer None[0] lo cual 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 es de hecho válido antes de intentar usarlo;

things = gimme_things()
if things:
    print("My first thing is {0}".format(things[0]))
else:
    print("No things")  # or raise an error, or do nothing, or ...

o equivalentemente atrapar el TypeError excepción;

things = gimme_things()
try:
    print("My first thing is {0}".format(things[0]))
except TypeError:
    print("No things")  # or raise an error, or do nothing, or ...

Otro 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.

def gimme_things():
    if something_happens():
        return ['all', 'the', 'things']
    else:  # make sure we always return a list, no matter what!
        logging.info("Something didn't happen; return empty list")
        return []

Por supuesto, lo que pones en el else: branch depende de su caso de uso. Quizás debería plantear una excepción cuando something_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 saber exactamente qué pasa cuando algo falla!

(Observe también cómo esta última solución todavía no soluciona completamente el error, le impide intentar subíndice None pero things[0] sigue siendo un IndexError cuando things es una lista vacía. Si tienes un try tu puedes hacer except (TypeError, IndexError) para atraparlo también.)

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

application

SLF4J Vs Log4j

tNcX7uA4BUGWHHKYCdsMZi 1200 80

Borderlands 3 Eridian Writing: cómo leerlo y para qué sirve