Outils personnels
Vous êtes ici : Accueil Python Quoi de neuf dans Python 2.5 PEP 308: Expressions conditionnelles

PEP 308: Expressions conditionnelles

Par Benjamin Poulain - Dernière modification 18/04/2008 21:03
Contributeurs : Bozo_le_clown
Python License

Python 2.5 introduit une nouvelle expression pour assigner une valeur à une variable selon une condition, à la façon de l'expression ternaire du langage C. Cette nouvelle expression, possède la syntaxe "variable = valeur_pour_vrai if condition else valeur_pour_faux". Cette syntaxe particulière a été choisie pour différencier une valeur habituelle et une valeur exceptionnelle.

Pendant longtemps, les développeurs ont demandé un moyen d'écrire des expressions conditionnelles, qui seraient des expressions retournant la valeur A ou B selon qu'un booléen est vrai ou faux. Une expression conditionnelle vous permet d'écrire une seule assignation ayant le même effet que le code suivant :

if condition:
x = valeur_pour_vrai
else:
x = valeur_pour_faux

Il y a eu des discussions interminables sur python-dev et sur comp.lang.python concernant la syntaxe la plus juste. Un vote a été lancé et a montré que la majorité des votants désiraient l'ajout d'expressions conditionnelles d'une façon ou d'une autre, mais aucune syntaxe n'était préférée par une vaste majorité.
Les candidats ont proposé des choses comme "condition ? valeur_pour_vrai : valeur_pour_faux", "if condition then valeur_pour_vrai else valeur_pour_faux", ainsi que 16 autres variations.

Finalement, Guido van Rossum choisit une syntaxe surprenante :

x = valeur_vrai if condition else valeur_faux

L'évaluation est toujours paresseuse comme dans les expressions booléennes habituelles, ce qui fait faire des sauts à l'évaluation de cette expression. L'expression condition au milieu de l'expression est d'abord évaluée, l'expression valeur_vrai n'est alors évaluée que si la condition est vraie. De la même façon, l'expression valeur_faux n'est évaluée que si condition est fausse.


De prime à bord cette syntaxe peut paraître étrange; pourquoi la condition vient au milieu de l'expression, et pas au début comme dans l'expression C "condition ? x : y" ? La décision a été validée en appliquant la nouvelle syntaxe aux modules de la bibliothèque standard et en regardant comment le code résultant est lu. Dans beaucoup de cas où une expression conditionnelle est utilisée, une valeur semblait correspondre au "cas commun" tandis que l'autre au "cas exceptionnel", utilisé seulement dans de rares occasions quand la condition n'était pas remplie. La syntaxe de l'expression rend ce genre de code plus évident à comprendre :

contenu = ( (doc + '\n) if doc else '' )

On lit l'opération précédente comme ceci "ici, contenu vaut habituellement doc + \n; parfois doc est vide, dans ce cas spécial une chaîne vide servira de contenu." Je doute que j'utiliserai des expressions conditionnelles très souvent quand il n'y a pas clairement un cas courant et un cas rare.

Il y a eu quelques discussions pour savoir si le langage devrait obliger à entourer la nouvelle expression avec des parenthèses. La décision fut prise de ne pas forcer l'usage des parenthèses dans la grammaire du langage Python, mais pour une question de style je pense que vous devriez toujours les utiliser. Considérez les deux opérations suivantes :

# Première version : pas de parenthèses
niveau = 1 if debug else 0

# Seconde version : avec parenthèses
niveau = (1 if debug else 0)

Dans la première version, je pense que les yeux du lecteur pourraient grouper les séquences "level = 1", "if debug", "else 0", et penser que la condition détermine si oui ou non l'assignation à niveau est réalisée. La seconde version apparaît meilleure, c'est mon opinion, parce qu'il rend évident que l'assignation est toujours effectuée et que le choix se fait entre deux valeurs.

Une autre raison pour inclure les parenthèses : quelques combinaisons de list comprehension et de lambda pourraient ressembler à une expression conditionnelle incorrecte. Voyez PEP 308 pour quelques exemples. Si vous ajoutez les parenthèses autour de vos expressions conditionnelles, ce problème n'apparaîtra pas.

Actions sur le document