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

Я пишу следующее, в котором я пытаюсь создать приличное сообщение об ошибке при сравнении двух многострочных блоков текста 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 ответов


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


assert expression, info

например,

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

С docs:

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

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


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

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

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

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

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

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

надеюсь, что это помогает.