Erklärung von 'oder' in Ausnahmesyntax, warum ist es gültige Syntax und wie funktioniert es?

8

Ein Kollege von mir hat diesen (vereinfachten) Code versehentlich eingegeben und sich gefragt, warum seine Ausnahme nicht erwischt wurde:

%Vor%

Jetzt weiß ich, dass die korrekte Syntax zum Abfangen beider Ausnahmearten except (IndexError, ValueError): sein sollte, aber warum gilt die obige gültige Syntax? Und wie funktioniert es?

Zum Beispiel wird der obige Code ValueError werfen und nicht gefangen werden. Aber nimm diesen Code:

%Vor%

Der IndexError wird gefangen. Wie wird das or ausgewertet und worauf wird es ausgewertet?!

Danke für jedes Licht, das du vergiessen kannst!

    
Ben 21.08.2013, 18:53
quelle

2 Antworten

12

Das liegt daran, dass IndexError or ValueError auf IndexError ausgewertet wird.

%Vor%

Der Operator or gibt den ersten Ausdruck zurück, der als True (in diesem Fall IndexError ) ausgewertet wird, oder den letzten Ausdruck, wenn keiner von ihnen True ist.
Ihre except-Anweisung entspricht also tatsächlich:

%Vor%     
Rohit Jain 21.08.2013, 18:55
quelle
3

Das Ergebnis der booleschen Operationen or und and ist immer einer der Operanden. Daher wird foo or bar auf foo ausgewertet, wenn foo truthy oder bar if foo if falsy.

In diesem Fall sind sowohl IndexError als auch ValueError truthy, also wird IndexError or ValueError zu IndexError ausgewertet, und Ihre except-Anweisung entspricht except IndexError .

    
Andrew Clark 21.08.2013 18:57
quelle

Tags und Links