637 Stimmen

Was bedeutet es, wenn ein Python-Objekt "subscriptable" ist oder nicht?

Welche Arten von Objekten fallen in den Bereich der "subscriptable"?

10voto

tripleee Punkte 155951

Als Folge der früheren Antworten hier, sehr oft ist dies ein Zeichen, dass Sie denken, Sie haben eine Liste (oder dict, oder andere subscriptable Objekt), wenn Sie nicht tun.

Nehmen wir zum Beispiel an, Sie haben eine Funktion, die sollte eine Liste zurückgeben;

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

Wenn Sie nun diese Funktion aufrufen, und something_happens() gibt aus irgendeinem Grund keine True Wert, was passiert dann? Die if scheitert, und so fallen Sie durch; gimme_things nicht explizit return irgendetwas - also wird es in der Tat implizit return None . Dann diesen Code:

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

wird mit " NoneType Objekt ist nicht subskribierbar", weil, nun ja, things es None und so versuchen Sie zu tun None[0] was keinen Sinn macht, weil ... was die Fehlermeldung sagt.

Es gibt zwei Möglichkeiten, diesen Fehler in Ihrem Code zu beheben -- die erste ist, den Fehler zu vermeiden, indem Sie überprüfen, dass things tatsächlich gültig ist, bevor Sie versuchen, sie zu verwenden;

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

oder gleichbedeutend mit dem Abfangen der TypeError Ausnahme;

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

Eine weitere Möglichkeit ist die Neugestaltung gimme_things so dass Sie sicherstellen, dass es immer eine Liste zurückgibt. In diesem Fall ist das wahrscheinlich das einfachere Design, weil es bedeutet, dass, wenn es viele Stellen gibt, an denen Sie einen ähnlichen Fehler haben, sie einfach und idiomatisch gehalten werden können.

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 []

Natürlich hängt es davon ab, was Sie in den else: Zweig hängt von Ihrem Anwendungsfall ab. Vielleicht sollten Sie eine Ausnahme auslösen, wenn something_happens() fehlschlägt, um offensichtlicher und deutlicher zu machen, wo etwas tatsächlich schief gelaufen ist? Das Hinzufügen von Ausnahmen zu Ihrem eigenen Code ist eine wichtige Methode, um genau zu wissen, was los ist, wenn etwas nicht funktioniert!

(Beachten Sie auch, dass diese letztere Korrektur den Fehler immer noch nicht vollständig behebt - sie verhindert, dass Sie versuchen, die None sondern things[0] ist immer noch ein IndexError cuando things ist eine leere Liste. Wenn Sie eine try können Sie tun except (TypeError, IndexError) um sie auch zu fangen.)

0voto

Codistan Punkte 1181

Grundsätzlich wird dieser Fehler angezeigt, wenn Sie ein Feld nach dem Typ-Casting für das genannte Objekt ändern oder hinzufügen, anstatt es vorher zu tun.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X