Parmi ceux-ci, aucun test.
if val != None:
if not (val is None):
if val is not None:
Lequel est préférable, et pourquoi ?
Parmi ceux-ci, aucun test.
if val != None:
if not (val is None):
if val is not None:
Lequel est préférable, et pourquoi ?
if val is not None:
# ...
est l'idiome pythonique pour tester qu'une variable n'est pas définie sur None
. Cet idiome a des utilisations particulières dans le cas de déclaration de fonctions de mots-clés avec des paramètres par défaut . is
teste l'identité en Python. Parce qu'il existe une et une seule instance de None
présent dans un script/programme Python en cours d'exécution, is
est le test optimal pour cela. Comme Johnsyweb fait remarquer Cette question est abordée dans PEP 8 sous la rubrique "Recommandations de programmation".
Quant à la raison pour laquelle cette solution est préférée à
if not (val is None):
# ...
cela fait simplement partie de la Zen du python : "La lisibilité compte." Un bon Python est souvent proche d'un bon pseudo-code .
De plus, "n'est pas" a une sémantique spéciale créée dans ce but (ce n'est pas une conséquence logique de la façon dont les expressions sont construites ; "1 est (pas None)" et "1 n'est pas None" ont deux résultats différents.
@gotgenes Pas toujours raison. Par exemple : var = ''. Si vous exécutez ce code, il teste avec succès la variable None. Par conséquent, vous n'êtes pas en mesure de tester si la variable a été définie sur None ou sur une chaîne vide.
De, Recommandations de programmation, PEP 8 :
Les comparaisons avec des singletons comme None doivent toujours être faites avec
is
ouis not
jamais les opérateurs d'égalité.Méfiez-vous également de l'écriture
if x
quand tu veux vraimentif x is not None
- Par exemple, lorsqu'on teste si une variable ou un argument dont la valeur par défaut est None a pris une autre valeur. L'autre valeur pourrait avoir un type (tel qu'un conteneur) qui pourrait être faux dans un contexte booléen !
PEP 8 est une lecture essentielle pour tout programmeur Python.
Pour ce type de questions, le mieux est de voir ce que fait exactement python. Le site dis
est incroyablement instructif :
>>> import dis
>>> dis.dis("val != None")
1 0 LOAD_NAME 0 (val)
2 LOAD_CONST 0 (None)
4 COMPARE_OP 3 (!=)
6 RETURN_VALUE
>>> dis.dis("not (val is None)")
1 0 LOAD_NAME 0 (val)
2 LOAD_CONST 0 (None)
4 COMPARE_OP 9 (is not)
6 RETURN_VALUE
>>> dis.dis("val is not None")
1 0 LOAD_NAME 0 (val)
2 LOAD_CONST 0 (None)
4 COMPARE_OP 9 (is not)
6 RETURN_VALUE
Remarquez que les deux derniers cas se réduisent à la même séquence d'opérations, Python se lit comme suit not (val is None)
et utilise le is not
opérateur . Le premier utilise le !=
opérateur en comparaison avec None
.
Comme l'ont souligné d'autres réponses, l'utilisation de !=
en comparaison avec None
est une mauvaise idée.
@evolvedmicrobe De la dis doc
( https://docs.python.org/3/library/dis.html ), COMPARE_OP
effectue l'opération booléenne correspondant au tuple dis.cmp_op = ('<', '<=', '==', '!=', '>', '>=', 'in', 'not in', 'is', 'is not', 'exception match', 'BAD')
. Donc COMPARE_OP 9
réalise is not
et COMPARE_OP 3
réalise !=
.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
Et si
if val:
?7 votes
Ce n'est pas le même test ! C'est
if
sera faux si val est 0, "", [], 0.0. etc. ainsi que si elle est None.