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?
Réponses
Trop de publicités? 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.
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.
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.
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