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.
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.
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__
etAssertionError
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.
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 ) )
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
Vous pouvez passer le message désiré lors de la création de l'exception.
raise AssertionError(line1 + ' != ' + line2)
Espérons que cette aide.