web-dev-qa-db-fra.com

`return None` en python non recommandé. Comment contourner?

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?

13
Aufwind

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.

39
Håvard S

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.

1
jcomeau_ictx

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
1
Henry

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.

0
forty_two