J'ai une fonction qui se connecte à une URL par httplib
en utilisant lxml
. Il vérifie par xpath
un certain modèle et, si le contrôle est positif, renvoie une chaîne. Mais si le chèque était négatif, il ne retourne rien.
Maintenant, la situation est que ma fonction retourne None
. J'appelle la fonction, vérifie si sa valeur de retour est not None
et continue dans le code.
Un exemple:
def foobar(arg):
# connect to page by httplib
# check for arg in a certain pattern by lxml
if check:
return result
else:
return None
result = foobar(arg)
if result:
# do stuff
else:
# do other stuff
Récemment, j'ai lu que ceci est un non va . Comment puis-je éviter de telles situations?
Il n'y a rien de mal à renvoyer None
.
Dans la plupart des cas, vous n'avez pas besoin de renvoyer explicitement None
. Python le fera pour vous. Ceci est une version modifiée de votre foobar
qui se comporte de manière identique sans renvoyer explicitement None
:
def foobar(arg):
if check:
return result
# If not check, then None will be returned
Néanmoins, même si Python renvoie implicitement None
, il existe une valeur à être explicite; Votre code devient plus facile à lire et à comprendre. C'est un compromis constant pour lequel il n'y a pas de réponse générale.
Cela dépend pourquoi c'est un "no go"; Je n'ai pas entendu ça. S'il s'agit simplement d'une mauvaise forme, omettez le "return None" (l'instruction else) complètement, et il retournera None par défaut. S'il est considéré comme incorrect de renvoyer Aucun, renvoyez 0 ou '' (chaîne vide) ou Faux, selon le type attendu par l'appelant.
Il existe de nombreux styles pour gérer cela, notamment utiliser des exceptions ou simplement renvoyer ce que vous obtenez, y compris une chaîne vide. C'est bien aussi:
def foobar(arg):
...
if check:
return result
result = foobar(arg)
if result is not None:
# do stuff
else:
# do other stuff
Je pense que retourner None
est un " no go " du point de vue de la convivialité plutôt que du style. Comme brièvement mentionné dans this answer, envisagez de créer une exception. Par exemple:
def foobar(arg):
# connect to page by httplib
# check for arg in a certain pattern by lxml
if not check:
raise ValueError("arg did not match pattern in lxml")
return result
try:
result = foobar(arg)
except ValueError:
result = None
if result is not None:
# do stuff
else:
# do other stuff
L'avantage de cette approche est qu'elle la rend explicite lorsqu'il n'y a pas de correspondance. Les autres personnes utilisant votre fonction n'auront pas besoin de savoir que None
est la valeur de retour à laquelle elles doivent s'attendre lorsqu'elles ne correspondent pas et qu'elles peuvent gérer l'exception à leur guise.