De la lien que vous avez posté :
La PF décourage ou interdit carrément les déclarations, et travaille plutôt avec l'évaluation d'expressions
Ainsi, au lieu de if
-vous pouvez utiliser un expression conditionnelle :
def function():
return (0 if ((A == 0) or (C != 0) or (A > 4)) else
someOtherFunction())
ou, (particulièrement utile s'il y a beaucoup de différents ) :
def function():
return (0 if A == 0 else
0 if C != 0 else
0 if A > 4 else
someOtherFunction())
Au fait, l'article lié propose
(<cond1> and func1()) or (<cond2> and func2()) or (func3())
comme un équivalent en court-circuit à
if <cond1>: func1()
elif <cond2>: func2()
else: func3()
Le problème est qu'ils ne sont pas équivalents ! L'expression booléenne ne renvoie pas la bonne valeur lorsque <cond1>
est Truish mais func1()
est faussé (par exemple False
o 0
o None
). (Ou de la même manière lorsque <cond2>
est Truish mais func2
est faussaire).
(<cond1> and func1())
est écrit avec l'intention d'évaluer à func1()
quand <cond1>
est Truish, mais lorsque func1()
est faussé, (<cond1> and func1())
évalue à False
l'expression entière est donc ignorée et Python continue à évaluer (<cond2> and func2())
au lieu de court-circuiter.
Voici donc un peu d'histoire intéressante. En 2005, Raymond Hettinger a trouvé un bug similaire difficile à trouver dans type(z)==types.ComplexType and z.real or z
quand z = (0+4j)
parce que z.real
est faussé. Motivée par le désir de nous épargner des bugs similaires, l'idée d'utiliser une syntaxe moins sujette aux erreurs (expressions conditionnelles) est né.