Подтвердить что ты не робот

Отладка 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()? Все советы приветствуются!

4b9b3361

Ответ 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 ...

Я рекомендую вам поместить эту функцию в отдельный модуль, чтобы вы могли повторно использовать ее каждый раз, когда вам это нужно.