J'écris par ce qui suit, dans lequel j'essaie de produire un message d'erreur décent lors de la comparaison de deux blocs multilignes de texte Unicode. La méthode intérieure qui fait la comparaison soulève une affirmation, mais l'explication par défaut ne me sert à rien
J'ai besoin d'ajouter quelque chose au code comme celui-ci ci-dessous:
def assert_long_strings_equal(one, other):
lines_one = one.splitlines()
lines_other = other.splitlines()
for line1, line2 in Zip(lines_one, lines_other):
try:
my_assert_equal(line1, line2)
except AssertionError, error:
# Add some information to the printed result of error??!
raise
Je ne peux pas comprendre comment modifier le message d'erreur imprimé dans l'erreur d'assertion que j'attrape. Je reçois toujours AssertionError: u'something' != 'something else'
, qui ne montre que la première ligne de la sortie.
Comment puis-je changer le message d'assertion pour imprimer ce que je veux?
Si c'est pertinent, j'utilise nose
pour exécuter le test.
Utilisation e.args
, e.message
est obsolète.
try:
assert False, "Hello!"
except AssertionError as e:
e.args += ('some other', 'important', 'information', 42)
raise
Cela préserve la trace d'origine. Sa dernière partie ressemble alors à ceci:
AssertionError: ('Hello!', 'some other', 'important', 'information', 42)
Fonctionne dans les deux Python 2.7 et Python 3.
assert expression, info
Par exemple,
>>> assert False, "Oopsie"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError: Oopsie
De la docs :
Les instructions d'assertion sont un moyen pratique d'insérer des assertions de débogage dans un programme:
assert_stmt ::= "assert" expression ["," expression]
La forme simple,
assert expression
, est équivalent àif __debug__: if not expression: raise AssertionError
La forme étendue
assert expression1, expression2
est équivalent à
if __debug__: if not expression1: raise AssertionError(expression2)
Ces équivalences supposent que
__debug__
etAssertionError
font référence aux variables intégrées portant ces noms. Dans l'implémentation actuelle, la variable intégrée__debug__
est True dans des circonstances normales, False lorsque l'optimisation est demandée (option de ligne de commande -O). Le générateur de code actuel n'émet aucun code pour une instruction assert lorsque l'optimisation est demandée au moment de la compilation. Notez qu'il n'est pas nécessaire d'inclure le code source de l'expression qui a échoué dans le message d'erreur; il sera affiché dans le cadre de la trace de la pile.
Avec cette méthode, j'ai pu modifier le message et avoir toujours la trace de la pile (+ toute autre information) visible. Les retours à la ligne sont également affichés à droite.
try:
my_assert_equal(line1, line2)
except AssertionError as e:
message = e.args[0]
message += "\nThis appends the default message and can have newlines"
e.args = (message,) #wrap it up in new Tuple
raise
Vous souhaitez prendre l'exception interceptée, la convertir en chaîne, la combiner avec des informations de chaîne supplémentaires et lever une nouvelle exception.
x = 3
y = 5
try:
assert( x == y )
except AssertionError, e:
raise( AssertionError( "Additional info. %s"%e ) )
Vous pouvez transmettre le message souhaité lors de la création de l'exception.
raise AssertionError(line1 + ' != ' + line2)
J'espère que cela t'aides.