[英]How can I check if a @patched-out python method is called, without changing its behavior?
[英]In Django/Python, how can I find out which method called my method?
我的方法的第一行是:
print "this method was called from "+filename_and_linenumber_of_code_that_called_it.
是否可以抛出异常,立即捕获它,并在调用方法时打印堆栈跟踪?
无需抛出异常即可查看堆栈。 我有这个很好的功能(它不完美,但我认为它有效)可能对你有所帮助:
import inspect
def log(error):
frame, filename, ln, fn, lolc, idx = inspect.getouterframes(inspect.currentframe())[1]
print "Error: " + error + " " + filename, ln, fn
它打印消息,后跟父函数所在文件的名称,然后是该文件中调用的行号,然后是函数的名称。 我希望它能帮助你:)
当我只想让代码在某些时候崩溃以查看回溯时,我只是在代码中放入“ crash
”。 因为它没有定义,它会崩溃,我将在django的异常页面中看到回溯。 如果另外,我使用django-extensions
提供的runserver_plus
命令(需要包werkzeug
),然后我在stacktrace的每一帧获得一个AJAX shell 。
我理解你的问题,我将提出一种处理这类问题的专业方法。 你要做的是被称为“ 调试 ” ,有一些工具。
快速入门 :
运行pip install ipython ipdb
通过import ipdb; ipdb.set_trace()
替换代码中的print语句import ipdb; ipdb.set_trace()
import ipdb; ipdb.set_trace()
在runserver中执行你的代码,它会暂停并生成一个python shell,你可以发送命令“ up
”转到前一个堆栈帧(代码调用你的代码) 。 如果要查看更多代码行,请键入l
。
更长的开始 :实际上我写了一个帮助调试python和django的工具概述 。
我不同意其他建议添加更精细的印刷声明的答案。 您希望成为一名优秀的开发人员:您希望使用调试器 。 无论是werkzeug,pdb / ipdb还是GUI,只要你能使用它就没关系。
这是CPython特有的:
import sys
def func():
frm = sys._getframe(1)
print 'called from %s, line %s' % (frm.f_code.co_filename, frm.f_lineno)
def test():
func() # line 8
test()
打印:
called from /path/to/script.py, line 8
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.