Python généralise un peu les opérations booléennes par rapport aux autres langages. Avant l'ajout de l'opérateur conditionnel "if" (similaire à l'opérateur ternaire ?:
de C), les utilisateurs écrivaient parfois des expressions équivalentes en utilisant cet idiome.
and
est définie pour renvoyer la première valeur si elle est booléenne faux, sinon retourne la deuxième valeur:
a and b == a if not bool(a) else b #except that a is evaluated only once
or
retourne sa première valeur si elle est booléenne vrai, sinon retourne sa seconde valeur:
a or b == a if bool(a) else b #except that a is evaluated only once
Si vous branchez True
et False
pour a
et b
dans les expressions ci-dessus, vous verrez qu'ils fonctionnent comme on peut s'y attendre, mais ils travailler pour d'autres types, comme les entiers, les chaînes, etc. Les entiers sont traités comme faux s'ils sont nuls, les conteneurs (y compris les chaînes) sont faux s'ils sont vides, et ainsi de suite.
Alors protocol = secure and "https" or "http"
ce que cela:
protocol = (secure if not secure else "https") or "http"
... qui est
protocol = ((secure if not bool(secure) else "https")
if bool(secure if not bool(secure) else "https") else "http")
L'expression secure if not bool(secure) else "https"
donne "https" si sécurisé est True
, sinon retourne la (fausse) valeur secure
. Donc secure if not bool(secure) else "https"
a la même vérité ou fausseté que secure
en lui-même, mais remplace les valeurs boolean-vrai secure
par "https". La partie or
extérieure de l'expression fait le contraire - elle remplace les valeurs boolean-false secure
par "http", et ne touche pas "https", parce que c'est vrai.
Cela signifie que l'expression globale fait ceci:
- si
secure
est faux, alors l'expression est évaluée à "http"
- si
secure
est vrai, alors l'expression est évaluée à "https"
... qui est le résultat que d'autres réponses ont indiqué.
La deuxième instruction est juste une mise en forme de chaîne - elle remplace chaque ligne de chaînes dans la chaîne "format" principale où %s
apparaît.
J'aime cette astuce d'affectation python, très pratique! :-) –
J'essaie d'éviter cette astuce. C'est plus déroutant que maniable. –