En C++, je peux imprimer une sortie de débogage comme ceci :
printf(
"FILE: %s, FUNC: %s, LINE: %d, LOG: %s\n",
__FILE__,
__FUNCTION__,
__LINE__,
logmessage
);
Comment puis-je faire quelque chose de similaire en Python ?
En C++, je peux imprimer une sortie de débogage comme ceci :
printf(
"FILE: %s, FUNC: %s, LINE: %d, LOG: %s\n",
__FILE__,
__FUNCTION__,
__LINE__,
logmessage
);
Comment puis-je faire quelque chose de similaire en Python ?
Il existe un module nommé inspect
qui fournit ces informations.
Exemple d'utilisation :
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()
Cependant, n'oubliez pas qu'il existe un moyen plus simple d'obtenir le nom du fichier en cours d'exécution :
print(__file__)
Par exemple
import inspect
frame = inspect.currentframe()
# __FILE__
fileName = frame.f_code.co_filename
# __LINE__
fileNo = frame.f_lineno
Il y a plus ici http://docs.python.org/library/inspect.html
S'appuyant sur la réponse 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 vous souhaitez normalement utiliser __LINE__
dans, par exemple print
(ou à tout autre moment où un str()
ou repr()
implicite est pris), ce qui précède vous permettra d'omettre les ()
s.
(Extension évidente pour ajouter un __call__
laissé comme exercice au lecteur.)
Vous pouvez vous référer à ma réponse : https://stackoverflow.com/a/45973480/1591700
import sys
print sys._getframe().f_lineno
Vous pouvez également faire la fonction lambda
wow, question de 7 ans :)
Quoi qu'il en soit, en prenant la réponse de Tugrul et en l'écrivant sous la forme d'une debug
, cela peut ressembler à quelque chose comme :
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()
Sortir:
/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
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.