Как автоматически генерировать информацию о подтверждении?
В 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