54 votes

Dois-je renvoyer aucun ou (aucun, aucun)?

Nous avons une méthode objet qui retourne un tuple ville / état, à savoir ('Boston', 'MA') . Dans certaines circonstances valables, il n'y a pas de ville / état valide à retourner. Stylistiquement, est-il plus logique de renvoyer None , ou un tuple à deux éléments contenant (None, None) dans ce cas?

57voto

Felix Kling Points 247451

Je retournerais None . S'il n'y a pas de résultat, pourquoi renvoyer quelque chose qui ressemble à un résultat?

Il est également plus facile de tester:

 result = getCity()
if result:
   # do something
 

Je ne retournerais que (None, None) s'il était possible qu'une seule des deux valeurs soit None (c'est-à-dire ('Boston', None) ). Ce serait plus cohérent dans ce cas.

44voto

Frédéric Hamidi Points 123646

En ne renvoyant qu'une seule valeur dans des circonstances exceptionnelles, vous risquez de casser l'idiome de décompression du tuple. Certains de vos appelants peuvent émettre:

 city, state = getCityStateTuple("something")
 

Dans ce cas, renvoyer None annulera l'appelant avec l'erreur suivante:

TypeError: 'NoneType' object is not iterable

Donc, personnellement, je retournerais (None, None) dans votre situation. Là encore, votre kilométrage peut varier, et cela dépend du modèle utilisé par vos appelants.

11voto

kindall Points 60645

Comme d'autres l'ont noté, un tuple avec les éléments, il ne fait pas de test False, ce qui est l'une des raisons que vous pourriez vouloir renvoyer None plutôt que d' (None, None). Toutefois, il est possible d'écrire un tuple de la sous-classe que les tests False même lorsque l'on a des éléments en surchargeant ses __nonzero__() méthode.

class falsetuple(tuple):
    def __nonzero__(self):
        return False

Ensuite, vous pouvez revenir falsetuple((None, None)) lorsque aucune valeur n'est disponible. En fait, vous pouvez toujours retourner le même falsetuple.

Je ne suis pas nécessairement en recommandant que vous faites cela, en fait j'ai de sérieux doutes au sujet du non-respect de cette convention, je dis juste que le truthiness de non-vide de n-uplets n'est pas nécessairement en soi une raison de ne pas retourner un n-uplet.

11voto

Brent Newey Points 2632

(None, None) n'est pas évalué en False en Python. En outre, la construction d'un tuple nécessite plus de travail que la construction d'un tuple. Je préférerais donc None .

6voto

Ethan Furman Points 12683

Si votre routine normalement retourne un tuple, puis un n-uplet est ce qu'elle doit revenir. Le vrai choix est entre le retour (None, None), ou le déclenchement d'une exception, et nous n'avons pas suffisamment d'informations pour offrir de bons conseils.

Si c'était moi, et j'ai choisi le n-uplet sur l'exception, j'irais avec le FalseTuple que kindall suggère, et aussi se rendre compte que le code d'appel (qui est à l'aide de n-uplet déballage) peut également tester

if city is None:

pour voir si un résultat valide a été obtenu. De cette façon, vous prenez en charge les n-uplet d'extraction à travers toutes les valeurs de retour possibles, et en permettant l'pythonic idiome de demander l'objet, "avez-vous évaluer en tant que Vrai?" (Ici est kindall du nouveau pour l'exhaustivité):

class FalseTuple(tuple):
    def __nonzero__(self):
        return False

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