Как автоматически генерировать информацию о подтверждении? - PullRequest
0 голосов
/ 01 февраля 2019

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

AssertionError

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

Например: So

assert 2 == 3

причины:

AssertionError: 2 != 3

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

Простым способом достижения вашей цели было бы использование функции-обертки, которая принимает заявленное условие в качестве строкового параметра, чтобы вы могли eval it и 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
0 голосов
/ 01 февраля 2019

Поскольку 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
0 голосов
/ 01 февраля 2019

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

def assert_eq(x, y):
  if x != y:
    print('error: {} != {}'.format(x, y))
  assert x == y
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...