11
votes

Exemple d'utilisation de Aster dans Python?

J'ai lu sur quand utiliser Assert vs. Exceptions, mais je ne "l'obtiens toujours pas". Il semble que je pense que je pense que je suis dans une situation où je devrais utiliser Assert, plus tard dans le développement, je trouve que je suis "cherche avant de sauter" pour m'assurer que l'affirmation n'éterd pas lorsque j'appelle la fonction. Comme il y a un autre idiome Python sur la préférence d'utiliser essayer, sauf, je finis généralement par abandonner l'affirmation et jetant une exception à la place. Je n'ai pas encore trouvé un endroit où il semble juste d'utiliser une affirmation. Quelqu'un peut-il proposer de bons exemples?


0 commentaires

4 Réponses :


3
votes

Generelly, affirmer est là pour vérifier une hypothèse que vous avez sur votre code, c'est-à-dire à ce moment-là, soit l'affirmation réussie, soit votre implémentation est en quelque sorte buggy. Une exception s'attend parfaitement à une erreur de se produire et de «embrasser» cela, c'est-à-dire vous permettre de le gérer.


0 commentaires

3
votes

Un bon exemple vérifie les arguments d'une fonction de cohérence: xxx


6 commentaires

Intéressant - je ne savais pas que 0. était sténographique pour 0.0 . Reply dit que c'est cependant. Je pourrais ne pas l'utiliser dans le code réel cependant parce qu'il semble trop "intelligent" et manqué facilement. Pourrait être compris comme une faute de frappe, mais 0,0 est toujours comprise pour signifier un flotteur.


Cela semble semblable à une situation où j'avais une fonction qui récupérait un élément d'une matrice 2D. Il était logique d'affirmer que les entrées de la rangée et de la colonne étaient réellement dans les limites de la matrice. Mais ensuite, plus tard, je faisais quelque chose où j'ai pris un élément et je voulais faire quelque chose avec des éléments adjacents. Une fois que j'ai commencé à coder cela, je devais avoir des cas particuliers lorsque l'élément était sur le bord, car des éléments adjacents étaient en dehors de la matrice. Il semblait mieux d'utiliser des exceptions à la place.


Comment les exceptions permettraient-elles de modifier le code? Lorsque vous modifiez le comportement de la fonction, vous devez toujours modifier la partie d'élévation de l'exception, n'est-ce pas?


C'est pas comment vous utilisez Assert. Les affirmations devraient échouer si le code est défectueux, et non lorsque l'entrée n'est pas tout aussi attendue. Si je reçois un ValueError (ou similaire) d'un appel à la fonction de quelqu'un d'autre, je sais que j'ai passé quelque chose d'invalide. Mais quand je reçois un assertionError , je dois supposer que la fonction est cassée (voir Autres réponses: les assertions sont des vérifications de santé mentale). -1


La décision n'a rien eu pour faciliter la modification du code, elle a eu à voir avec l'utilisation d'un bloc d'essai au lieu de vérifier les valeurs avant d'appeler la fonction.


@delnan: Un point équitable, je suppose que cela dépend de ce que vous essayez d'accomplir avec l'instruction affirmation . J'utilise quelque chose de très proche de la première affirmation assez souvent en tant que code défensif pour s'assurer que l'accumulation d'erreurs de points flottants ne constitue pas un vecteur de probabilité invalide. Je conviens que pour une fonction publique dans une bibliothèque, les utilisateurs doivent être informés des erreurs de manière plus informative.



23
votes

Une bonne ligne directive utilise affirmer lorsque son déclenchement signifie un bug dans votre code. Lorsque votre code suppose quelque chose et agit sur l'hypothèse, il est recommandé de protéger cette hypothèse avec un affirmer . Ce affirme échec signifie que votre hypothèse n'est pas correcte, ce qui signifie que votre code n'est pas correct.


0 commentaires

16
votes

ont tendance à utiliser Assert pour vérifier que les choses ne devraient jamais arriver . une sorte de chèque de santé mentale.

Une autre chose à réaliser est que affirme est supprimé lorsque optimisé:

Le générateur de code actuel n'émet aucun code pour une instruction d'affirmation lorsque l'optimisation est demandée lors de la compilation.


1 commentaires

+1 Pour souligner que cela affirme est supprimé si vous invoquez Python avec le drapeau -o . Le point est que si vous êtes Attendez-vous Votre code pour toujours vous comporter différemment si vous prenez les affirmations, vous les abuse, ils ne leur font que le débogage.