Вывести значения аргументов в функции в трассировке стека - PullRequest
0 голосов
/ 28 февраля 2020

Как мы можем напечатать значения аргументов, переданных функциям в стеке вызовов при выводе трассировки стека ошибок? Я хотел бы, чтобы выходные данные были точно такими же, как в примере ниже.

Пример:

Traceback (most recent call last):
  File "./file.py", line 615, in func0 **(arg0) arg0 = 0 was passed**
    result = func1(arg1, arg2)
  File "./file.py", line 728, in func1 **(arg1, arg2) arg1 = 1 and arg2 = 2 was passed**
    return int_value[25]
TypeError: 'int' object is not iterable

Я бы хотел, чтобы информация внутри ** ** s также была напечатана в дополнение к нормальному выводу в трассировку стека. Я предполагаю, что отладчик также автоматически печатает переданные аргументы. Это дало бы четкое представление о «функциональном конвейере», через который проходили данные, и о том, что с ним происходило в конвейере, и какая функция не выполняла того, что должна была делать. Это поможет отладке.

Я довольно долго искал и нашел следующие вопросы:

, но ответы ни на один из них не сработали: ответ на 1-й привел к ModuleNotFoundError: No module named 'stackdump'. Ответ на второй сбил мой ipython интерпретатор с очень длинной трассировкой стека.

Я также посмотрел вверх:

Кажется, есть переменная capture_locals для TracebackException с, но я не совсем понял, как это сделать работа.

1 Ответ

1 голос
/ 28 февраля 2020

Возможно, существуют лучшие альтернативы, но вы можете использовать для этого декоратор:

def print_stack_arguments(func):
    def new_func(*original_args, **original_kwargs):
        try:
            return func(*original_args, **original_kwargs)
        except Exception as e:
            print('Function: ', func.__name__)
            print('Args: ', original_args)
            print('Kwargs: ', original_kwargs)
            print(e)
            raise
    return new_func


@print_stack_arguments
def print_error(value):
    a = []
    print(a[1])


@print_stack_arguments
def print_noerror(value):
    print('No exception raised')


print_noerror('testing no exception')
print_error('testing exception')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...