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?
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.
Es verhält sich so, weil or
ein Kurzschlussoperator ist, Details sind in
Marcin Pietraszek
05.04.2013 07:38
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%Tags und Links python styles correctness