web-dev-qa-db-fra.com

Comment changer le message dans une Python AssertionError?

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.

44
Andres Jaan Tack

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.

49
Honza Javorek
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__ et AssertionError 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.

75
Katriel

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
4
Antti Väyrynen

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 ) )
4
Russell Borogove

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.

3
zchtodd