2010-10-27 5 views
1

Étant donné que secure est un booléen, que font les instructions suivantes?Logique Python dans l'affectation

Surtout la première déclaration.

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

J'aime cette astuce d'affectation python, très pratique! :-) –

+1

J'essaie d'éviter cette astuce. C'est plus déroutant que maniable. –

Répondre

4

Il met à "https" si secure est vrai, sinon il le définit à "http".

Essayez dans l'interprète:

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

+1: "Essayez-le" Cela a plus de sens que de demander. –

-1

En psuedocode:

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

La première ligne n'est pas valide Python – pillmuncher

+0

Il devrait être '" https "si sécurisé sinon" http "' –

+4

C'est pseudo-code. – yfeldblum

12

Je déteste cet idiome Python, il est complètement opaque jusqu'à ce que quelqu'un explique. Dans 2.6 ou supérieur, vous utiliseriez:

protocol = "https" if secure else "http" 
+0

merci! Je "savais" quels seraient les résultats, mais la déclaration me semblait cryptique et je ne pouvais pas l'obtenir. –

4

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.

1

La première ligne a été bien répondu par le Ned et se détendre.

La 2ème instruction est un remplacement de chaîne. Chaque% s est un espace réservé pour une valeur de chaîne. Donc, si les valeurs sont les suivantes:

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

la chaîne résultante serait la suivante:

http://localhost/home 
Questions connexes