Comment changer le message dans une AssertionError de Python?

j'écris par ce qui suit, dans lequel j'essaie de produire un message d'erreur décent en comparant deux blocs multilignes de texte Unicode. La méthode intérieure qui fait la comparaison soulève une assertion, mais l'explication par défaut est inutile pour moi

j'ai besoin d'ajouter quelque chose à code comme 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 changer le message d'erreur imprimé dans l'erreur assertionerror que je capte. Je reçois toujours AssertionError: u'something' != 'something else', qui montre seulement la première ligne de sortie.

Comment puis-je changer le message d'affirmation pour imprimer ce que je veux?

si c'est pertinent, j'utilise nose pour faire le test.

36
demandé sur Andres Jaan Tack 2010-09-28 00:43:13

5 réponses

Utiliser 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 le traceback original. Sa dernière partie ressemble alors à ceci:

AssertionError: ('Hello!', 'some other', 'important', 'information', 42)

fonctionne en python 2.7 et Python 3.

44
répondu Honza Javorek 2016-04-08 09:29:42
assert expression, info

Par exemple,

>>> assert False, "Oopsie"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: Oopsie

docs:

affirmer que les déclarations sont un moyen pratique pour 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 allongée

assert expression1, expression2

est équivalent à

if __debug__:
    if not expression1:
        raise AssertionError(expression2)

ces équivalences supposent que __debug__ et AssertionError consultez les variables intégrées avec celles nom. Dans l'implémentation actuelle, la variable intégrée __debug__ est Vrai dans des circonstances normales, faux lorsque l'optimisation est demandé (option de ligne de commande-O). Actuel générateur de code n'émet pas de code pour un affirmation de la déclaration lorsque l'optimisation est demandé au moment de la compilation. Notez que il est inutile d'inclure l' le code source pour l'expression que échoué dans le message d'erreur; il être affiché dans le cadre de pile trace.

61
répondu Katriel 2010-09-27 21:34:10

vous voulez prendre l'exception capturée, la convertir en une chaîne, la combiner avec quelques informations de chaîne supplémentaires, et soulever une nouvelle exception.

x = 3
y = 5
try:
    assert( x == y )
except AssertionError, e:
    raise( AssertionError( "Additional info. %s"%e ) )
5
répondu Russell Borogove 2010-09-27 22:46:20

Avec cette méthode, j'ai pu éditer le message et ont encore la trace de la pile (+autres) visible. De plus, les nouvelles lignes sont affichées à 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
5
répondu Antti Väyrynen 2013-11-06 07:59:00

Vous pouvez passer le message désiré lors de la création de l'exception.

raise AssertionError(line1 + ' != ' + line2)

Espérons que cette aide.

1
répondu zchtodd 2010-09-27 20:52:34