Как автоматически генерировать информацию о подтверждении?

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

AssertionError

Что я должен сделать, чтобы автоматически генерировать сообщение, объясняющее причину ошибки, путем анализа AST аргумента условия?

например: так

assert 2 == 3

причины:

AssertionError: 2 != 3

3 ответа

Если зависимости являются проблемой, вы можете легко сделать это самостоятельно. то есть:

def assert_eq(x, y):
  if x != y:
    print('error: {} != {}'.format(x, y))
  assert x == y

Простой способ достичь вашей цели - использовать функцию-оболочку, которая принимает заявленное условие в качестве строкового параметра, чтобы вы могли eval это и assert результат, ловя AssertionError в try блок, так что вы можете повторно вызвать исключение с данной строкой в ​​качестве сообщения:

def my_assert(condition):
    try:
        assert eval(condition)
    except AssertionError as e:
        e.args = condition,
        raise

чтобы:

my_assert('2 == 3')

поднимет:

AssertionError: 2 == 3

Поскольку AssertionError это класс, вы можете получить свой собственный, который делает то, что вы хотите. Сложная часть заключается в том, чтобы подключить его к интерпретатору. assert Постулаты.

Вот кое-что, что, кажется, работает, но я не знаю, будет ли это так, когда используется в сочетании с ноутбуком Jupyter.

import builtins
import traceback


class MyAssertionError(builtins.AssertionError):
    def __init__(self, *args):
        super(MyAssertionError, self).__init__(*args)
        raw_tb = traceback.extract_stack()
        entries = traceback.format_list(raw_tb)

        # Remove the last two entries for the call to extract_stack(). Each
        # entry consists of single string with consisting of two lines, the
        # script file path then the line of source code making the call to this
        # function.
        del entries[-2:]
        self.lines = '\n'.join(entries)

    def __str__(self):
        return super(MyAssertionError, self).__str__() + '\n' + self.lines

builtins.AssertionError = MyAssertionError  # Replace builtin.


if __name__ == '__main__':

    assert 2 == 3
Другие вопросы по тегам