248 votes

si A vs si A n'est pas Aucun:

Puis-je utiliser:

 if A:
 

au lieu de

 if A is not None:
 

Ce dernier semble si prolixe. Y a-t-il une différence?

219voto

Greg Hewgill Points 356191

La déclaration

if A:

appellera A.__nonzero__() (voir méthode Spéciale noms de la documentation) et utiliser la valeur de retour de cette fonction. Voici le résumé:

object.__nonzero__(self)

Appelés à mettre en œuvre vérité le test de la valeur et de l'exploitation intégré bool(); doit renvoyer False ou True, ou leur entier équivalents 0 ou 1. Lorsque cette méthode n'est pas définie, __len__() est appelée, si elle est définie, et l'objet est considérée comme vraie si son résultat est différent de zéro. Si une classe ne définit ni __len__() ni __nonzero__(), toutes ses instances sont considérées comme de vraies.

D'autre part,

if A is not None:

compare uniquement la référence A avec None pour voir si elle est la même ou pas.

85voto

scraplesh Points 435

Comme écrit dans la PEP8:

  • Comparaisons des singletons comme Aucun devrait toujours être fait avec "est" ou "n'est pas", ne jamais les opérateurs d'égalité.

    Aussi, méfiez-vous de l'écriture de "si x" lorsque vous vraiment dire "si x n'est pas Rien" -- par exemple, lors de l'essai de savoir si une variable ou d'un argument dont la valeur par défaut Aucun n'a été défini sur une autre valeur. L'autre valeur que peut avoir un type de (comme un conteneur) qui pourraient être faux dans un contexte booléen!

20voto

Kirk Strauser Points 12087

Beaucoup de retour des fonctions Aucune si il n'y a pas des résultats pertinents. Par exemple, un SQLAlchemy requête .first() méthode renvoie None s'il n'y avait pas de lignes dans le résultat. Supposons que vous soyez en sélectionnant une valeur qui peut retourner la valeur 0, et ont besoin de savoir si c'est en fait 0 ou si la requête a pas de résultats à tous.

Un idiome commun est de donner une fonction ou une méthode de l'argument facultatif, la valeur par défaut, Aucun, et puis pour tester la valeur None pour voir si elle a été spécifiée. Par exemple:

def spam(eggs=None):
    if eggs is None:
        eggs = retrievefromconfigfile()

comparez-la à:

def spam(eggs=None):
    if not eggs:
        eggs = retrievefromconfigfile()

Dans ce dernier, ce qui se passe si vous appelez spam(0) ou spam([])? La fonction (à tort) de détecter que vous n'aviez pas passé à une valeur de eggs et calcule une valeur par défaut pour vous. Ce n'est probablement pas ce que vous voulez.

Ou imaginez une méthode comme "retour à la liste des transactions pour un compte donné". Si le compte n'existe pas, il pourrait retourner Aucun. C'est différent que de retourner une liste vide (ce qui voudrait dire "ce compte existe mais n'a pas enregistré des transactions).

Enfin, de retour à la base de données des trucs. Il y a une grosse différence entre la valeur NULL et une chaîne vide. Une chaîne vide est généralement dit "il y a une valeur, et cette valeur n'est rien du tout". NULL dit "cette valeur n'a pas été saisi."

Dans chacun de ces cas, vous voulez les utiliser if A is None. Vous êtes à la recherche d'une valeur spécifique - Aucun - pas seulement "quelque valeur que ce qui arrive à lancer pour de Faux".

10voto

Colin Coghill Points 890

La plupart des guides que j'ai vus suggèrent que vous devriez utiliser

si un:

sauf si vous avez une raison d'être plus spécifique.

Il y a quelques légères différences. Il existe des valeurs autres que Aucune qui renvoient la valeur False, par exemple des listes vides, ou 0. Réfléchissez donc à ce que vous testez réellement.

9voto

keflavich Points 2310

Si A: sera faux si A est 0, Faux ou Aucun, ce qui peut conduire à des résultats non souhaités.

Prograide.com

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.

Powered by:

X