Подтвердить что ты не робот

Как изменить сообщение в Python AssertionError?

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

Мне нужно добавить что-то к коду, например, ниже:

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

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

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

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

4b9b3361

Ответ 1

Использовать 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.

Ответ 2

assert expression, info

Например,

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

Из docs:

Операторы утверждения являются удобным способом вставить утверждения отладки в Программа:

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__Правда при нормальных обстоятельствах, False при запросе оптимизации (опция командной строки -O). Электрический ток генератор кода не генерирует код для утверждать, когда оптимизация во время компиляции. Обратите внимание, что нет необходимости включать исходный код выражения Ошибка в сообщении об ошибке; это будет отображаться как часть стека след.

Ответ 3

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

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

Ответ 4

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

x = 3
y = 5
try:
    assert( x == y )
except AssertionError, e:
    raise( AssertionError( "Additional info. %s"%e ) )

Ответ 5

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

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

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