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