Получить номер строки вызывающей функцию в теле функции
К примеру
def f(x):
line_number=how_get_5_if_call_from_f(2)
f(1)
f(2)
f(3)
То есть функция f вызывается несколько раз со строк 4,5,6 (считая номера строк самой функции и пустой строки). Нужно в теле функции, то есть во второй строке, присвоить переменной line_number значение равное номеру строки из которой была вызвана функция. то есть для f(1) line_number должно быть равно 4 (считая код самой функции и пустую строку)
Ответы (2 шт):
Можно посчитать сколько раз вызывалась:
def f(x, count_call):
if count_call == 2:
print ('if rows2 --> call in 2 rows')
print ('call in {0} rows'.format(x))
return count_call + 1
count_f_call = 0
count_f_call = f(1, count_f_call)
count_f_call = f(2, count_f_call)
count_f_call = f(3, count_f_call)
Либо отрабатывать исключение, которое будет говорить в какой строке ошибка:
import traceback
def f(x):
try:
x / 0
except Exception:
print(traceback.format_exc())
f(1)
f(2)
f(3)
С помощью функции traceback.extract_stack() можно получить информацию о стеке вызовов, в том числе из какой строки была вызвана текущая функция:
import traceback
def f(x):
print(traceback.extract_stack()) # Полная информация о стеке вызовов
print(traceback.extract_stack()[-2].lineno) # Только номер строки, откуда была вызвана функция
f(1)
f(2)
f(3)
Вывод:
[<FrameSummary file /home/user/Projects/test.py, line 9 in <module>>, <FrameSummary file /home/user/Projects/test.py, line 5 in f>]
9
[<FrameSummary file /home/user/Projects/test.py, line 10 in <module>>, <FrameSummary file /home/user/Projects/test.py, line 5 in f>]
10
[<FrameSummary file /home/user/Projects/test.py, line 11 in <module>>, <FrameSummary file /home/user/Projects/test.py, line 5 in f>]
11
Последний элемент в стеке вызовов соответствует вызову функции traceback.extract_stack(), предпоследний ([-2]) - вызову функции f(x). Считаем от конца, т.к. вызовов может быть несколько, и первый элемент в стеке будет соответствовать самому внешнему вызову (например, если сначала вызывается функция main, а из нее функция f, то первый элемент стека будет вызовом функции main)