2009-03-23 2 views
12

Warum löst list.index eine Ausnahme aus, anstatt einen beliebigen Wert zu verwenden (z. B. -1)? Was ist die Idee dahinter?Python list.index löst Ausnahme aus, wenn der Index nicht gefunden wurde

Für mich sieht es sauberer aus, mit speziellen Werten statt mit Ausnahmen umzugehen.

BEARBEITEN: Ich habe nicht realisiert -1 ist ein potenziell gültiger Wert. Warum auch nicht etwas anderes? Wie wäre es mit einem Wert von None?

Antwort

12

Weil -1 selbst ein gültiger Index ist. Es könnte einen anderen Wert verwenden, wie None, aber das wäre nicht nützlich, die -1 kann in anderen Situationen sein (also str.find()), und würde einfach zu Fehlerprüfung, für die genau Ausnahmen sind.

3

In Python, -1 ist ein gültiger Index, eine Nummer aus dem Ende der Liste (statt am Anfang), was bedeutet, wenn Sie also

idx = mylist.index(someval) 
nextval = mylist[idx+1] 

tun sind dann würden Sie den ersten Wert erhalten des Arrays, anstatt zu erkennen, dass ein Fehler aufgetreten ist. Auf diese Weise können Sie die Ausnahme abfangen und damit umgehen. Wenn Sie nicht über Ausnahmen wollen, dann nur vorher überprüfen:

if someval in mylist: 
    idx = mylist.index(someval) 

Edit: Es gibt nicht wirklich jeder Punkt in der Rückkehr ohne, denn wenn Sie keine testen gehen, könnten Sie auch, ob der Wert testen ist in der Liste wie oben!

6

Nun, der spezielle Wert müsste eigentlich None sein, denn -1 ist ein gültiger Index (bedeutet das letzte Element einer Liste).

idx = l.index(x) if x in l else None 
+2

Solange Sie zweimal .. –

+2

gut durch die Liste der Suche, es ist das, oder versuchen,/außer nichts ausmacht. – vartec

1

Eine einfache Idee:

können Sie dieses Verhalten emulieren -1 als Index perfekt geeignet ist (wie andere negative Werte).

8

Zu Devins Antwort hinzufügen: Dies ist eine alte Debatte zwischen speziellen Rückgabewerten versus Ausnahmen. Viele Programmiergurus bevorzugen eine Ausnahme, weil ich bei einer Ausnahme den gesamten StackTrace sehen und sofort ableiten kann, was falsch ist.

+1

Das war, was ich mich fragte: spezielle Rückgabewerte versus Ausnahmen. –

+3

+1: Ausnahmen hängen nicht davon ab, ob ein Wert "heilig" ist. Ausnahmen sind oft einfacher zu handhaben. –

+0

Die Ausnahmefeind Leute könnten argumentieren, dass 'index' nicht ein Objekt zu finden ist kein Fehler, und Ausnahmen sollten nur auf Fehler verwendet werden. Ich bin für Ausnahmen in diesem Fall. Ausnahmen können schneller sein, da sie den Erfolg nicht überprüfen müssen. Python zieht deshalb in vielen Fällen Ausnahmen vor. Mit anderen Worten, wenn "index" ein Objekt findet, wird die Ausführung ohne Bedingungsprüfung fortgesetzt. Wenn 'index' nichts findet, werden Sie ohne Überprüfungen in den catch-Block geworfen. –

1

Es ist ein semantisches Argument. Wenn Sie den Index eines Elements wissen wollen, behaupten Sie, dass es bereits in der Liste existiert. Wenn Sie wissen möchten, ob es existiert, sollten Sie in verwenden.

+1

... und wenn Sie behaupten, dass es eine Ausnahme gibt, ist der richtige Weg, damit umzugehen. –

2

Ich stimme Devin Jeanpierre zu und würde hinzufügen, dass der Umgang mit speziellen Werten in kleinen Beispielen gut aussehen kann, aber (mit einigen bemerkenswerten Ausnahmen, zB NaN in FPUs und Null in SQL) nicht annähernd skaliert . Das einzige Mal, es funktioniert, ist, wo:

  • Sie haben typischerweise eine Menge verschachtelt homogene Verarbeitung (zB Mathematik oder SQL) bekam
  • Sie kümmern sich nicht um die Unterscheidung Fehlertypen
  • Sie kümmern sich nicht wo der Fehler aufgetreten ist
  • Die Operationen sind reine Funktionen, ohne Nebenwirkungen.
  • Versagen kann eine angemessene Bedeutung auf der höheren Ebene gegeben werden (zum Beispiel „Keine Zeilen matched“)
3

Es ist in erster Linie, um sicherzustellen, dass Fehler so schnell wie möglich aufgefangen werden. Betrachten wir zum Beispiel die folgenden:

l = [1, 2, 3] 
x = l.index("foo") #normally, this will raise an error 
l[x] #However, if line 2 returned None, it would error here 

werden Sie feststellen, dass ein Fehler würde bei l[x] eher bekommen geworfen als bei x = l.index("foo") wenn Index Keine Rückkehr waren. In diesem Beispiel ist das nicht wirklich eine große Sache. Aber stell dir vor, dass die dritte Zeile an einem völlig anderen Ort in einem Millionen-Zeilen-Programm steht. Dies kann zu einem kleinen Albtraum führen.

4

Die "Ausnahme-gegen-Fehler-Wert" -Debatte ist teilweise über Code-Klarheit. Betrachten Sie Code mit einem Fehlerwert:

idx = sequence.index(x) 
if idx == ERROR: 
    # do error processing 
else: 
    print '%s occurred at position %s.' % (x, idx) 

Die Fehlerbehandlung endet in der Mitte unseres Algorithmus verstopfte, Programmablauf verschleiern. Auf der anderen Seite:

try: 
    idx = sequence.index(x) 
    print '%s occurred at position %s.' % (x, idx) 
except IndexError: 
    # do error processing 

In diesem Fall ist die Menge an Code effektiv die gleiche, aber der Hauptalgorithmus ist durch die Fehlerbehandlung ungebrochen.

0
def GetListIndex(list, searchString): 
    try: 
     return list.index(searchString) 

    except ValueError: 
     return False 

    except Exception: 
     raise 
Verwandte Themen