Welche Arten von Objekten fallen in den Bereich der "subscriptable"?
Antworten
Zu viele Anzeigen?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.)
- See previous answers
- Weitere Antworten anzeigen