В С++ я могу распечатать вывод отладки следующим образом:
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
Вы также можете сделать лямбда-функцию