¿Cómo determinar el número de archivo, función y línea?

En C ++, puedo imprimir la salida de depuración de esta manera:

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

¿Cómo puedo hacer algo similar en Python?

Hay un módulo llamado inspect que proporciona esta información.

Ejemplo de uso:

 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() 

Sin embargo, recuerde que hay una forma más fácil de obtener el nombre del archivo que se está ejecutando actualmente:

 print(__file__) 

Por ejemplo

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

Hay más información aquí http://docs.python.org/library/inspect.html

Sobre la base de la respuesta de 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__() 

Si normalmente desea usar __LINE__ en, por ejemplo, print (o en cualquier otro momento en que se tome un str() o repr() implícito), lo anterior le permitirá omitir los () s.

(Extensión obvia para agregar un __call__ dejado como un ejercicio para el lector).

 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__()) 

También me interesó un comando __LINE__ en python. Mi punto de partida fue https://stackoverflow.com/a/6811020 y lo extendí con un objeto de metaclase. Con esta modificación tiene el mismo comportamiento que en 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 

Puede referir mi respuesta: https://stackoverflow.com/a/45973480/1591700

 import sys print sys._getframe().f_lineno 

También puedes hacer la función lambda.

wow, 7 años pregunta 🙂

De todos modos, tomando la respuesta de Tugrul y escribiéndola como un método de tipo debug , puede verse algo como:

 def debug(message): import sys import inspect callerframerecord = inspect.stack()[1] frame = callerframerecord[0] info = inspect.getframeinfo(frame) print(info.filename, 'func=%s' % info.function, 'line=%s:' % info.lineno, message) def somefunc(): debug('inside some func') debug('this') debug('is a') debug('test message') somefunc() 

Salida:

 /tmp/test2.py func= line=12: this /tmp/test2.py func= line=13: is a /tmp/test2.py func= line=14: test message /tmp/test2.py func=somefunc line=10: inside some func