Как определить файл, функцию и номер строки?

В С++ я могу распечатать вывод отладки следующим образом:

printf(
   "FILE: %s, FUNC: %s, LINE: %d, LOG: %s\n",
   __FILE__,
   __FUNCTION__,
   __LINE__,
   logmessage
);

Как я могу сделать что-то подобное в Python?

Ответ 1

Существует модуль с именем inspect, который предоставляет эту информацию.

Пример использования:

import inspect

def PrintFrame():
  callerframerecord = inspect.stack()[1]    # 0 represents this line
                                            # 1 represents line at caller
  frame = callerframerecord[0]
  info = inspect.getframeinfo(frame)
  print info.filename                       # __FILE__     -> Test.py
  print info.function                       # __FUNCTION__ -> Main
  print info.lineno                         # __LINE__     -> 13

def Main():
  PrintFrame()                              # for this line

Main()

Однако помните, что есть более простой способ получить имя исполняемого файла:

print __file__

Ответ 2

Например

import inspect
frame = inspect.currentframe()
# __FILE__
fileName  =  frame.f_code.co_filename
# __LINE__
fileNo = frame.f_lineno

Здесь больше здесь http://docs.python.org/library/inspect.html

Ответ 3

Основываясь на ответе geowar:

class __LINE__(object):
    import sys

    def __repr__(self):
        try:
            raise Exception
        except:
            return str(sys.exc_info()[2].tb_frame.f_back.f_lineno)

__LINE__ = __LINE__()

Если вы обычно хотите использовать __LINE__, например. print (или в любой другой момент неявный str() или repr()), вышесказанное позволит вам опустить () s.

(Очевидное расширение для добавления a __call__ в качестве упражнения для читателя).

Ответ 4

import inspect
    .
    .
    .
def __LINE__():
    try:
        raise Exception
    except:
        return sys.exc_info()[2].tb_frame.f_back.f_lineno

def __FILE__():
    return inspect.currentframe().f_code.co_filename
    .
    .
    .
print "file: '%s', line: %d" % (__FILE__(), __LINE__())

Ответ 5

Меня также интересовала команда __LINE__ в python. Моя начальная точка была fooobar.com/questions/41484/..., и я расширил ее с помощью объекта metaclass. С этой модификацией он имеет такое же поведение, как в С++.

import inspect

class Meta(type):
    def __repr__(self):
        # Inspiration: /questions/41484/how-to-determine-file-function-and-line-number/299301#299301
        callerframerecord = inspect.stack()[1]  # 0 represents this line
        # 1 represents line at caller
        frame = callerframerecord[0]
        info = inspect.getframeinfo(frame)
        # print(info.filename)  # __FILE__     -> Test.py
        # print(info.function)  # __FUNCTION__ -> Main
        # print(info.lineno)  # __LINE__     -> 13
        return str(info.lineno)

class __LINE__(metaclass=Meta):
    pass

print(__LINE__)  # print for example 18

Ответ 6

Вы можете отсылать мой ответ: fooobar.com/info/41487/...

import sys
print sys._getframe().f_lineno

Вы также можете сделать лямбда-функцию