Как изменить сообщение в 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 asserterror. Я всегда получаю AssertionError: u'something' != 'something else' , который показывает только первую строку вывода.

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

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

  • Является ли «файл» ключевым словом в python?
  • Коды языков интернационализации Django
  • Присвоение нескольких значений столбцам pandos pandas DataFrame в одной строке
  • TypeError: объект «RelatedManager» не является итерируемым
  • Как напечатать количество символов на основе ширины терминала, которая также изменяет размер?
  • Веб-скребок - как определить основной контент на веб-странице
  • Автозаполнение Python на экземплярах объектов в VIM
  • Как написать таблицу (список списков) в Google Spreadsheet с помощью gspread
  • 5 Solutions collect form web for “Как изменить сообщение в Python AssertionError?”

    Используйте 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 

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

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

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

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

     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 

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

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

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

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

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

    Python - лучший язык программирования в мире.