Информация о трассировке, потерянная в декораторе - PullRequest
0 голосов
/ 06 января 2019

При выполнении следующего кода я не могу получить ожидаемый номер строки из информации трассировки, которую я извлек из sys.exc_info() внутри декоратора.

import sys


def get_traceback(function):
    def wrapper(*args, **kwargs):
        try:
            function(*args, **kwargs) # line 7
        except:
            return sys.exc_info()[2]
    return wrapper


def inner():
    raise ValueError() # line 14 <--- the expected line number


@get_traceback
def outer():
    inner() # line 19


tb = outer()
print(tb.tb_lineno) # prints 7
print(tb.tb_next.tb_lineno) # prints 19

При аналогичном вызове на sys.exc_info() вне декоратора я могу получить соответствующий номер строки. В чем причина этого и что я могу сделать, чтобы получить правильный номер строки?

Заранее спасибо!

1 Ответ

0 голосов
/ 06 января 2019

Декоратор просто добавляет еще один шаг к вашей трассировке.

Вот как вы можете получить его с помощью traceback встроенной библиотеки:

import traceback

tb = outer()

traceback.extract_tb(tb)[-1].lineno

или в предыдущем стиле добавьте еще tb_next :

print(tb.tb_next.tb_next.tb_lineno)
...