如何确定文件,函数和行号?
在C ++中,我可以像这样打印debugging输出:
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
build立在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__()
如果你通常想在例如print
(或其他任何时候使用隐式str()
或repr()
使用__LINE__
,上面的代码就可以省略()
s。
(明显的扩展是将__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__())
我也对Python中的__LINE__命令感兴趣。 我的出发点是https://stackoverflow.com/a/6811020 ,我用一个元类对象扩展它。 通过这个修改,它具有和C ++一样的行为。
import inspect class Meta(type): def __repr__(self): # Inspiration: https://stackoverflow.com/a/6811020 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
你可以参考我的回答: https : //stackoverflow.com/a/45973480/1591700
import sys print sys._getframe().f_lineno
你也可以使lambda函数