Как получить номер строки определения класса вызывающего абонента?

#python #class #traceback #inspect

#python #класс #трассировка #Осмотр

Вопрос:

Есть некоторые пакеты, в которых есть некоторые методы, такие как subscribe or add , которые позволяют пользователю добавлять настраиваемую функцию обратного вызова. Для целей отладки и любопытства я хотел бы знать, какая функция и какой класс в этом пакете фактически вызвали мою функцию обратного вызова позже. Поэтому было бы неплохо, если бы у меня был номер строки класса.

Минимальный рабочий пример

 # test.py
import inspect


class Foo: # line 5

    def caller(self):
        print("Hello from caller")
        b=Bar()
        b.func()

class Bar:

    def func(self):
        print("Hello from func")
        stack = inspect.stack()
        the_class = stack[1][0].f_locals["self"].__class__.__name__
        the_method = stack[1][0].f_code.co_name
        # Need some help here to get value 5
        # To do
        # ...
        print(f"Called by {the_class}.{the_method}()")


f = Foo()
f.caller()
 

Вывод:

 Hello from caller
Hello from func
Called by Foo.caller()
 

Вопрос: Внутри func , как получить значение 5, которое является номером строки определения class Foo ? В идеале с помощью inspect или другой магии трассировки, а не путем поиска строки в файле.

Комментарии:

1. Чего вы на самом деле пытаетесь достичь здесь? Что вы будете делать с номером строки?

2. @jonrsharpe, я добавляю больше деталей о мотивации.