Отладка Python: получить имя файла и номер строки, из которого вызывается функция?
В настоящее время я создаю довольно сложную систему на Python, и когда я отлаживаю, я часто ставил простые операторы печати в нескольких сценариях. Чтобы сохранить обзор, я часто также хочу распечатать имя файла и номер строки, где расположен оператор печати. Я могу, конечно, сделать это вручную или с чем-то вроде этого:
from inspect import currentframe, getframeinfo
print getframeinfo(currentframe()).filename + ':' + str(getframeinfo(currentframe()).lineno) + ' - ', 'what I actually want to print out here'
который печатает что-то вроде:
filenameX.py:273 - то, что я на самом деле хочу распечатать здесь
Чтобы сделать его более простым, я хочу иметь возможность сделать что-то вроде:
print debuginfo(), 'what I actually want to print out here'
Поэтому я поставил его в какую-то функцию и попытался сделать:
from debugutil import debuginfo
print debuginfo(), 'what I actually want to print out here'
print debuginfo(), 'and something else here'
К сожалению, я получаю:
debugutil.py:3 - what I actually want to print out here
debugutil.py:3 - and something else here
Он печатает имя файла и номер строки, на котором я определил функцию, вместо строки, на которую я вызываю debuginfo(). Это очевидно, потому что код находится в файле debugutil.py.
Итак, мой вопрос на самом деле: Как я могу получить имя файла и номер строки, из которого вызывается эта функция debuginfo()? Все советы приветствуются!
Ответы
Ответ 1
Функция inspect.stack()
возвращает список записей фрейма, начиная с вызывающего абонента и перемещаясь, который вы можете использовать для получения необходимой информации:
from inspect import getframeinfo, stack
def debuginfo(message):
caller = getframeinfo(stack()[1][0])
print "%s:%d - %s" % (caller.filename, caller.lineno, message)
def grr(arg):
debuginfo(arg)
grr("aargh")
Выход
example.py:8 - aargh
Ответ 2
Просто поместите введенный код в функцию:
from inspect import currentframe, getframeinfo
def my_custom_debuginfo(message):
print getframeinfo(currentframe()).filename + ':' + str(getframeinfo(currentframe()).lineno) + ' - ', message
а затем используйте его как хотите:
# ... some code here ...
my_custom_debuginfo('what I actually want to print out here')
# ... more code ...
Я рекомендую вам поместить эту функцию в отдельный модуль, чтобы вы могли повторно использовать ее каждый раз, когда вам это нужно.