tutorial lenguaje español descargar python

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



python tutorial (7)

En C ++, puedo imprimir resultados 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?


Basándose en 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 utilizar __LINE__ en, por ejemplo, print (o en cualquier otro momento en que se tome implícitamente str() o repr() ), lo anterior le permitirá omitir los () s.

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


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 manera 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 aquí inspect


Puede remitir mi respuesta: https://.com/a/45973480/1591700

import sys print sys._getframe().f_lineno

También puedes hacer que la función lambda


También me interesó un comando __LINE__ en Python. Mi punto de partida era share 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://.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


wow, pregunta de 7 años :)

De todos modos, tomando la respuesta de Tugrul, y escribiéndola como un método de tipo de debug , puede verse algo así 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=<module> line=12: this /tmp/test2.py func=<module> line=13: is a /tmp/test2.py func=<module> line=14: test message /tmp/test2.py func=somefunc line=10: inside some func


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