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.
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.
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żneif __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__
iAssertionError
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.
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 ) )
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
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.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