Как изменить сообщение в Python AssertionError? - PullRequest
42 голосов
/ 28 сентября 2010

Я пишу согласно следующему, в котором я пытаюсь выдать приличное сообщение об ошибке при сравнении двух многострочных блоков текста Unicode.Внутренний метод, который делает сравнение, поднимает утверждение, но объяснение по умолчанию бесполезно для меня

Мне нужно добавить что-то в код, такой как этот ниже:

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

Я не могу понятьКак изменить напечатанное сообщение об ошибке в assertionerror я ловлю.Я всегда получаю AssertionError: u'something' != 'something else', который показывает только первую строку выходных данных.

Как я могу изменить сообщение с утверждением, чтобы распечатать все, что я хочу?

Еслиэто актуально, я использую nose для запуска теста.

Ответы [ 5 ]

69 голосов
/ 28 сентября 2010
assert expression, info

Например,

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

Из документов :

Утверждения Assert - удобный способ вставить отладочные утвержденияв программу:

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

Простая форма assert expression эквивалентна

if __debug__:
    if not expression:
        raise AssertionError 

Расширенная форма

assert expression1, expression2

эквивалентна

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

В этих эквивалентностях предполагается, что __debug__ и AssertionError относятся к встроенным переменным с этими именами.В текущей реализации встроенная переменная __debug__ имеет значение True при нормальных обстоятельствах и False при запросе оптимизации (опция командной строки -O).Текущий генератор кода не генерирует код для оператора assert, когда во время компиляции запрашивается оптимизация.Обратите внимание, что нет необходимости включать исходный код для выражения, которое не удалось в сообщении об ошибке;он будет отображаться как часть трассировки стека.

47 голосов
/ 27 февраля 2013

Использование e.args, e.message устарело.

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

Это сохраняет исходную трассировку. Его последняя часть выглядит следующим образом:

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

Работает как в Python 2.7, так и в Python 3.

5 голосов
/ 06 ноября 2013

С помощью этого метода я смог отредактировать сообщение и по-прежнему видеть трассировку стека (+ любую другую информацию). Также новые строки отображаются справа.

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 голосов
/ 28 сентября 2010

Вы хотите взять перехваченное исключение, преобразовать его в строку, объединить с дополнительной информацией о строке и вызвать новое исключение.

x = 3
y = 5
try:
    assert( x == y )
except AssertionError, e:
    raise( AssertionError( "Additional info. %s"%e ) )
3 голосов
/ 28 сентября 2010

Вы можете передать желаемое сообщение при создании исключения.

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

Надеюсь, это поможет.

...