J'ai une fonction qui peut renvoyer l'une des trois choses suivantes:
- succès (
True
) - échec (
False
) - erreur de lecture / analyse du flux (
None
)
Ma question est la suivante: si je ne suis pas censé effectuer un test True
ou False
comment devrais-je voir quel est le résultat. Voici comment je le fais actuellement:
result = simulate(open("myfile"))
if result == None:
print "error parsing stream"
elif result == True: # shouldn't do this
print "result pass"
else:
print "result fail"
est-ce vraiment aussi simple que de supprimer la == True
partie ou devrais-je ajouter un type de données tri-bool. Je ne veux pas que la simulate
fonction lève une exception car tout ce que je veux que le programme externe fasse avec une erreur est de l'enregistrer et de continuer.
simulate
fonction, j'attrape toutes les exceptions; Je ne veux pas que ce qui se passe dans le simulateur arrête le reste du programme en cours d'exécution (et le traitement de l'élément suivant). Mais les réponses me font changer d'avis.simulate
des choses qu'il peut attraper et réessayer, c'est bien. Mais s'il "échoue", il ne devrait pas revenirNone
. Il devrait simplement déclencher une exception au script qui l'a appelé. De toute façon,simulate
c'est fait. Le retourNone
n'est pas aussi utile que de lever une exception appropriée - ou de permettre à une exception de se propagersimulate
dans le script appelant pour la gestion.except Exception:
plutôt. Cela détecte toutes les erreurs «réelles», ainsi queWarning
etStopIteration
. Cela permetKeyboardInterrupt
et àSystemExit
travers cependant. Si vous voulez vraiment les attraper, il est probablement préférable d'utiliser une autre structure externe try / except ou une autre structure qui documente clairement votre intention, car ce ne sont pas des "erreurs". (Mais j'ai dit "presque jamais" ... peut-être que dans votre cas, vous voulez vraiment tout saisir, et même empêcher Ctrl-C ousys.exit()
de sortir, etc.)Réponses:
N'ayez pas peur de l'exception! Avoir votre programme simplement se connecter et continuer est aussi simple que:
Et maintenant, vous pouvez avoir un type de notification beaucoup plus riche de la méthode de simulation quant à ce qui n'a pas fonctionné exactement, au cas où vous trouveriez que l'erreur / aucune erreur n'est pas suffisamment informative.
la source
traceback.format_exc()
. Voir cette réponse SO.restez simple et explicite. Vous pouvez bien sûr prédéfinir un dictionnaire.
Si vous prévoyez de modifier votre
simulate
fonction pour inclure plus de codes de retour, la maintenance de ce code peut devenir un peu un problème.Le
simulate
peut également soulever une exception sur l'erreur d'analyse, auquel cas vous l'attraperiez ici ou le laisseriez propager un niveau supérieur et le bit d'impression serait réduit à une instruction if-else d'une ligne.la source
Jamais, jamais, jamais dire
Jamais. C'est fou, car vous répétez de manière redondante ce qui est spécifié de manière redondante comme règle de condition redondante pour une instruction if.
Pire encore, jamais, jamais, jamais dire
Vous avez
not
. Sentez-vous libre de l'utiliser.Enfin, faire
a == None
est inefficace. Faitesa is None
.None
est un objet singleton spécial, il ne peut y en avoir qu'un. Vérifiez simplement si vous possédez cet objet.la source
True
n'est pas redondant (même si je suis d'accord que ce n'est pas raisonnable). Il peut s'agir d'appeler une__eq__
ou une autre méthode spéciale, qui pourrait pratiquement tout faire.if something == True
donnent un résultat différent de celuiif something
, par exemple, pour les non-booléenssomething
.2==True
donne faux alors que2
vaut vrai;None==False
est faux maisnot None
est vrai!something
retoursTrue
surbool(something)
. Dans ce cas, si vous voulez UNIQUEMENT vérifier sisomething
a une valeur deTrue
iebool
. Ensuite, vous DEVEZ faireif something == True
IMO.Je voudrais souligner que, même s'il y a des situations où cela
if expr :
ne suffit pas parce que l'on veut être sûr queexpr
c'estTrue
et pas seulement différent de0
/None
/ quoi que ce soit, ilis
faut préférer==
pour la même raison que S.Lott a mentionnée pour éviter== None
.Il est en effet un peu plus efficace et, cerise sur le gâteau, plus lisible par l'homme.
la source
Je pense que jeter une exception est une meilleure idée pour votre situation. Une alternative sera la méthode de simulation pour renvoyer un tuple. Le premier élément sera le statut et le second le résultat:
la source
False
est renvoyé, il s'imprimera'error parsing stream'
.