2008-12-06 4 views
7

Je viens de rencontrer cet idiome dans un Python open-source, et je me suis étouffé avec mon verre.Est-ce idiot pythonic? (someBool et "True Result" ou "False Result")

Plutôt que:

if isUp: 
    return "Up" 
else: 
    return "Down" 

ou même:

return "Up" if isUp else "Down" 

le code lu:

return isUp and "Up" or "Down" 

Je peux voir ce résultat est le même, mais est-ce un idiome typique en Python? Si oui, est-ce un bidouillage de la performance qui court vite? Ou est-ce juste une seule fois qui a besoin d'un examen du code?

Répondre

17

L'idiome "a et b ou c" était la manière canonique d'exprimer l'arithmétique ternaire si en Python, avant que PEP 308 ait été écrit et implémenté. Cet idiome échoue la réponse "b" est fausse elle-même; pour soutenir le cas général, vous pouvez écrire

return (a and [b] or [c])[0] 

Une autre façon de l'orthographe était

return (b,c)[not a] 

qui, avec l'introduction du type bool, pourrait être réécrite comme

return (c,b)[bool(a)] 

(dans le cas où ce n'est pas clair: la conversion en bool, et l'opérateur not, est nécessaire si on ne sait pas déjà bool)

Aujourd'hui, la syntaxe d'expression conditionnelle doit être utilisée si la chose doit être une expression; Sinon, je recommande d'utiliser l'instruction if.

+4

La syntaxe alternative a une différence avec l'opérateur et/ou la méthode ou l'opérateur ternaire - les deux valeurs sont toujours évaluées. Ce n'est pas un gros problème si ce ne sont que des variables, mais s'il y a des appels de fonction (en particulier avec des effets secondaires), cela fera une différence. – Brian

0

Ce code est un grand fugly et intelligent à mon goût, mais je suppose qu'il n'y a rien de mal en soi. Je pense que c'est vraiment juste un cas de syndrome «faites tout dans une ligne».

Personnellement, j'aurais opté pour le premier formulaire.

-1

Non, ce n'est pas le cas. J'ai eu un similar question l'autre jour.

si la construction

val if cond else alt 

était pas bienvenus (au moins par la communauté SO) et celle préférée était:

if cond: 
    val 
else: 
    alt 

Vous pouvez obtenir votre propre conclusion. :)

-1

Yikes. Pas lisible du tout. Pour moi, pythonic signifie facile à lire.

return isUp and "Up" or "Down" 

Semble quelque chose que vous feriez dans Perl.

9

Vous devriez lire Using the and-or trick (section 4.6.1) de Plongez dans Python par Mark Pilgrim.Il s'avère que le ou-ou le tour a des pièges importants dont vous devriez être conscient.

Questions connexes