Jak zmienić wiadomość w Python AssertionError?

Piszę zgodnie z poniższym, w którym próbuję wygenerować przyzwoity komunikat o błędzie podczas porównywania dwóch wielowierszowych bloków tekstu Unicode. Metoda wewnętrzna, która wykonuje porównanie, podnosi twierdzenie, ale domyślne Wyjaśnienie jest dla mnie bezużyteczne

Muszę dodać coś do kodu takiego jak ten poniżej:

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

Nie mogę dowiedzieć się, jak zmienić wydrukowany komunikat o błędzie w przechwyconym asertionerror. Zawsze dostaję AssertionError: u'something' != 'something else', który pokazuje tylko pierwszą linijkę wyjście.

Jak mogę zmienić komunikat twierdzenia, aby wydrukować to, co chcę?

Jeśli to istotne, używam nose do przeprowadzenia testu.

Author: Andres Jaan Tack, 2010-09-28

5 answers

Użycie e.args, e.message jest przestarzały.

try:
    assert False, "Hello!"
except AssertionError as e:
    e.args += ('some other', 'important', 'information', 42)
    raise

To zachowuje oryginalny ślad. Jego ostatnia część wygląda więc tak:

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

Działa zarówno w Pythonie 2.7, jak i Pythonie 3.

 44
Author: Honza Javorek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-08 09:29:42
assert expression, info

Na przykład,

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

Z docs :

Twierdzenia są wygodnym sposobem aby wstawić asercje debugowania do program:

assert_stmt ::=  "assert" expression
["," expression] 

Prosta forma, assert expression, jest równoważne

if __debug__:
    if not expression:
        raise AssertionError 

Forma Rozszerzona

assert expression1, expression2

Jest równoważne

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

Te ekwiwalencje zakładają, że __debug__ i AssertionError odnoszą się do wbudowanych zmiennych z tymi nazwiska. W obecnym realizacja, wbudowana zmienna __debug__ jest Prawda w normalnych okolicznościach, fałsz gdy wymagana jest optymalizacja (opcja wiersza poleceń-O). Prąd Generator kodów nie emituje kodu dla twierdzenie, gdy optymalizacja jest wymagane w czasie kompilacji. Zauważ, że nie jest konieczne włączenie kod źródłowy wyrażenia, które nie powiodło się w komunikacie o błędzie; będzie być wyświetlane jako część stosu trace.

 61
Author: Katriel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-27 21:34:10

Chcesz wziąć przechwycony wyjątek, przekonwertować go na ciąg znaków, połączyć z dodatkowymi informacjami o łańcuchu i podnieść nowy wyjątek.

x = 3
y = 5
try:
    assert( x == y )
except AssertionError, e:
    raise( AssertionError( "Additional info. %s"%e ) )
 5
Author: Russell Borogove,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-27 22:46:20

Dzięki tej metodzie mogłem edytować wiadomość i nadal mieć widoczny ślad stosu (+wszelkie inne informacje). Również nowe linie są wyświetlane po prawej stronie.

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
Author: Antti Väyrynen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-06 07:59:00

Możesz przekazać żądaną wiadomość podczas tworzenia wyjątku.

raise AssertionError(line1 + ' != ' + line2)
Mam nadzieję, że to pomoże.
 1
Author: zchtodd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-27 20:52:34