3 Stimmen

Python-Logik im Auftrag

Angesichts der Tatsache, dass secure ein boolescher Wert ist, was bewirken die folgenden Anweisungen?

Insbesondere die erste Aussage.

  1. protocol = secure and "https" or "http"
  2. newurl = "%s://%s%s" % (protocol,get_host(request),request.get_full_path())

0 Stimmen

Ich liebe diesen Python-Zuweisungstrick, wirklich praktisch! :-)

2 Stimmen

Ich versuche, diesen Trick zu vermeiden. Er ist eher verwirrend als praktisch.

13voto

Ned Batchelder Punkte 342778

Ich hasse dieses Python Idiom, es ist völlig undurchsichtig, bis es jemand erklärt. In 2.6 oder höher, würden Sie verwenden:

protocol = "https" if secure else "http"

0 Stimmen

Danke! Ich "wusste", was die Ergebnisse sein würden, aber die Aussage erschien mir kryptisch und ich konnte sie nicht verstehen.

5voto

unwind Punkte 377331

Sie setzt protocol zu "https", wenn secure wahr ist, andernfalls wird er auf "http" gesetzt.

Probieren Sie es im Interpreter aus:

>>> True and "https" or "http"
'https'
>>> False and "https" or "http"
'http'

5voto

Doug Punkte 8420

Python verallgemeinert boolesche Operationen im Vergleich zu anderen Sprachen ein wenig. Bevor der "if"-Bedingungsoperator hinzugefügt wurde (ähnlich wie C's ?: ternären Operator), wurden manchmal äquivalente Ausdrücke mit diesem Idiom geschrieben.

and ist so definiert, dass der erste Wert zurückgegeben wird, wenn er boolesch-falsch ist, ansonsten wird der zweite Wert zurückgegeben:

a and b == a if not bool(a) else b #except that a is evaluated only once

or gibt seinen ersten Wert zurück, wenn er boolesch-wahr ist, sonst seinen zweiten Wert:

a or b == a if bool(a) else b #except that a is evaluated only once

Wenn Sie den Stecker True y False para a y b in den obigen Ausdrücken sehen Sie, dass sie so funktionieren, wie Sie es erwarten würden, aber sie funktionieren auch für andere Typen, wie Integer, Strings usw.. Ganzzahlen werden als falsch behandelt, wenn sie Null sind, Container (einschließlich Strings) sind falsch, wenn sie leer sind, und so weiter.

Also protocol = secure and "https" or "http" tut dies:

protocol = (secure if not secure else "https") or "http"

...der ist

protocol = ((secure if not bool(secure) else "https") 
            if bool(secure if not bool(secure) else "https") else "http")

Der Ausdruck secure if not bool(secure) else "https" gibt "https" an, wenn sicher ist True , sonst wird die (falsche) secure Wert. Also secure if not bool(secure) else "https" hat die gleiche Wahr-oder-Falschheit wie secure selbst, sondern ersetzt boolean-true secure Werte mit "https". Die äußere or Teil des Ausdrucks bewirkt das Gegenteil - er ersetzt boolean-false secure Werte mit "http", und berührt "https" nicht, weil es wahr ist.

Dies bedeutet, dass der allgemeine Ausdruck dies tut:

  • wenn secure falsch ist, dann wird der Ausdruck als "http" ausgewertet
  • wenn secure wahr ist, dann wird der Ausdruck als "https" ausgewertet

...das ist das Ergebnis, auf das andere Antworten hingewiesen haben.

Die zweite Anweisung dient lediglich der Formatierung von Zeichenketten - sie ersetzt jede der Tupel von Zeichenketten durch die Hauptzeichenkette "format", wo auch immer %s erscheint.

1voto

Hollister Punkte 3568

Die erste Zeile wurde von Ned und unwind gut beantwortet.

Die 2. Anweisung ist eine Zeichenfolgenersetzung. Jedes %s ist ein Platzhalter für einen Zeichenfolgenwert. Wenn die Werte also sind:

protocol = "http"
get_host(request) = "localhost"
request.get_full_path() = "/home"

wäre die resultierende Zeichenkette:

http://localhost/home

0voto

yfeldblum Punkte 64211

In Psuedocode:

protocol = (if secure then "https" else "http")
newurl = protocol + "://" + get_host(request) + request.get_full_path()

0 Stimmen

Erste Zeile ist kein gültiges Python

0 Stimmen

Es sollte sein "https" if secure else "http"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X