Eh bien, c'est une question ouverte, et j'ai deux aspects que je veux aborder: quand ajouter des assertions et comment écrire les messages d'erreur.
Objectif
Pour l'expliquer à un débutant - les assertions sont des déclarations qui peuvent soulever des erreurs, mais vous ne les attraperez pas. Et ils ne devraient normalement pas être élevés, mais dans la vraie vie, ils le sont parfois de toute façon. Et c'est une situation grave, dont le code ne peut pas récupérer, ce que nous appelons une «erreur fatale».
Ensuite, c'est à des fins de débogage qui, bien que correctes, semblent très dédaigneuses. J'aime mieux la formulation `` déclarant les invariants, qui ne devraient jamais être violés '', même si cela fonctionne différemment selon les débutants ... ou même contrôler le flux avec elle.
Style
En Python, assert
c'est une instruction, pas une fonction! (rappelez assert(False, 'is true')
- vous ne soulèvera pas. Mais, ayant cela à l'écart:
Quand et comment écrire le «message d'erreur» facultatif?
Cela s'applique en fait aux frameworks de tests unitaires, qui ont souvent de nombreuses méthodes dédiées pour faire des assertions ( assertTrue(condition)
, assertFalse(condition), assertEqual(actual, expected)
etc.). Ils fournissent souvent également un moyen de commenter l'assertion.
Dans le code jetable, vous pouvez vous passer des messages d'erreur.
Dans certains cas, il n'y a rien à ajouter à l'affirmation:
def dump (quelque chose): assert isinstance (quelque chose, Dumpable) # ...
Mais à part cela, un message est utile pour la communication avec d'autres programmeurs (qui sont parfois des utilisateurs interactifs de votre code, par exemple dans Ipython / Jupyter, etc.).
Donnez-leur des informations, pas seulement des détails sur la mise en œuvre interne.
au lieu de:
assert meaningless_identifier <= MAGIC_NUMBER_XXX, 'meaningless_identifier is greater than MAGIC_NUMBER_XXX!!!'
écrire:
assert meaningless_identifier > MAGIC_NUMBER_XXX, 'reactor temperature above critical threshold'
ou peut-être même:
assert meaningless_identifier > MAGIC_NUMBER_XXX, f'reactor temperature({meaningless_identifier }) above critical threshold ({MAGIC_NUMBER_XXX})'
Je sais, je sais - ce n'est pas un cas pour une assertion statique, mais je veux souligner la valeur informationnelle du message.
Message négatif ou positif?
Cela peut être controversé, mais cela me fait mal de lire des choses comme:
assert a == b, 'a is not equal to b'
ce sont deux choses contradictoires écrites l'une à côté de l'autre. Donc, chaque fois que j'ai une influence sur la base de code, je pousse pour spécifier ce que nous voulons, en utilisant des verbes supplémentaires comme «must» et «should», et pour ne pas dire ce que nous ne voulons pas.
affirmer a == b, 'a doit être égal à b'
Ensuite, obtenir AssertionError: a must be equal to b
est également lisible et l'instruction semble logique dans le code. En outre, vous pouvez en tirer quelque chose sans lire le traceback (qui peut parfois même ne pas être disponible).