В С++ я могу распечатать вывод отладки следующим образом:
printf(
   "FILE: %s, FUNC: %s, LINE: %d, LOG: %s\n",
   __FILE__,
   __FUNCTION__,
   __LINE__,
   logmessage
);
Как я могу сделать что-то подобное в Python?
В С++ я могу распечатать вывод отладки следующим образом:
printf(
   "FILE: %s, FUNC: %s, LINE: %d, LOG: %s\n",
   __FILE__,
   __FUNCTION__,
   __LINE__,
   logmessage
);
Как я могу сделать что-то подобное в Python?
Существует модуль с именем 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__
		Например
import inspect
frame = inspect.currentframe()
# __FILE__
fileName  =  frame.f_code.co_filename
# __LINE__
fileNo = frame.f_lineno
Здесь больше здесь http://docs.python.org/library/inspect.html
Основываясь на ответе 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__ в качестве упражнения для читателя).
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__())
		Меня также интересовала команда __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
		Вы можете отсылать мой ответ: fooobar.com/info/41487/...
import sys
print sys._getframe().f_lineno
Вы также можете сделать лямбда-функцию