if (foo oder bar oder baz) ist None:

8

Ich habe einen ziemlich widerwärtigen Code umgestaltet und bin auf das folgende ziemlich merkwürdige Konstrukt gestoßen:

%Vor%

... und ich fragte mich, ob das jemals irgendeinen denkbaren Sinn machen würde.

Ich habe es so geändert:

%Vor%

Ich habe einen Interpreter gestartet und das erste Konstrukt tatsächlich versucht ... es scheint nur zu funktionieren, wenn die Werte alle falsch sind und der letzte dieser falschen Werte ist None. (Mit anderen Worten, die CPython-Implementierung scheint den ersten wahren oder letzten falschen Wert aus einer Kette von oder Ausdrücken zurückzugeben.

Ich vermute immer noch, dass der richtige Code entweder das any () oder all () verwenden sollte -ins, die 2,5 hinzugefügt wurden (der betreffende Code erfordert bereits 2,7). Ich bin mir noch nicht sicher, welches die bevorzugte / beabsichtigte Semantik ist, da ich gerade mit diesem Projekt anfange.

Gibt es also einen Fall, in dem dieser ursprüngliche Code sinnvoll wäre?

    
Jim Dennis 05.04.2013, 07:35
quelle

4 Antworten

5

Das Kurzschlussverhalten bewirkt, dass foo or bar or baz den ersten der drei Werte zurückgibt, der Boolean-True ist, oder den letzten Wert, wenn alle Boolean-False sind. Es bedeutet also im Grunde "wenn alle falsch sind und der letzte ist keiner".

Ihre geänderte Version ist etwas anders. if None in (opts.foo, opts.bar, opts.baz) wird zum Beispiel den if Block eingeben, wenn opts.foo None ist und die anderen beiden sind 1, während die ursprüngliche Version nicht (weil None or 1 or 1 wird auf 1 ausgewertet, was nicht None ist). Ihre Version wird if eingeben, wenn any der drei None ist, unabhängig davon, was die anderen beiden sind, während die ursprüngliche Version nur dann in if eintritt, wenn letzte ist None und die anderen beiden sind irgendwelche boolesche-false-Werte.

Welche der beiden Versionen Sie möchten, hängt davon ab, wie der übrige Code strukturiert ist und welche Werte die Optionen haben können (insbesondere ob sie andere Boolesche / falsche Werte als None haben könnten, z. B. False oder 0 oder eine leere Zeichenfolge). Intuitiv scheint deine Version vernünftiger zu sein, aber wenn der Code so spezielle Tricks hat, weißt du nie, welche Eckenfälle auftreten könnten.

    
BrenBarn 05.04.2013, 07:47
quelle
5

Es verhält sich so, weil or ein Kurzschlussoperator ist, Details sind in Marcin Pietraszek 05.04.2013 07:38

quelle
0

Ich würde

bevorzugen %Vor%

wie es genau das beabsichtigte Ziel ausdrückt.

OTOH,

%Vor%

prüft auf Falschheit, nicht auf None .

Der ursprüngliche Code scheint keinen Sinn zu ergeben; es scheint von jemandem geschrieben worden zu sein, der nicht weiß, was sie tun.

    
glglgl 05.04.2013 07:54
quelle
0

lasst uns beide Codes ausprobieren:

%Vor%

Sie können sehen, dass Ihre Neuschreibung nicht mit dem ursprünglichen Code übereinstimmt.

Ihre erste Bedingung gibt nur True zurück, wenn alle Ihre Variablen None

sind %Vor%

so können Sie Ihre erste Bedingung in:

umschreiben %Vor%     
HVNSweeting 05.04.2013 08:00
quelle

Tags und Links