我发现自己经常添加调试“打印”语句 - 这样的事情:
print("a_variable_name: %s" % a_variable_name)
你们都是这样做的?我是否在试图寻找优化方法的神经质?我可能正在研究一个函数并输入这些函数中的大约六个,弄清楚它为什么不起作用,然后再将它们删除。
你有没有一种有效的方法呢?
我在Emacs中编写Python代码。
答案 0 :(得分:9)
有时调试器很棒,但有时使用print语句更快,更容易重复设置和使用。
这可能仅适用于使用CPython进行调试(因为并非所有Pythons都实现inspect.currentframe
和inspect.getouterframes
),但我发现这对于减少输入非常有用:
在utils_debug.py中:
import inspect
def pv(name):
record=inspect.getouterframes(inspect.currentframe())[1]
frame=record[0]
val=eval(name,frame.f_globals,frame.f_locals)
print('{0}: {1}'.format(name, val))
然后在你的script.py中:
from utils_debug import pv
使用此设置,您可以替换
print("a_variable_name: %s' % a_variable_name)
与
pv('a_variable_name')
请注意pv
的参数应该是字符串(变量名或表达式),而不是值本身。
要使用Emacs删除这些行,您可以
C-x ( # start keyboard macro
C-s pv('
C-a
C-k # change this to M-; if you just want to comment out the pv call
C-x ) # end keyboard macro
然后你可以用C-x e
调用一次宏
或C-u 1000 C-x e
当然,您必须要小心,确实要删除包含pv('
的所有行。
答案 1 :(得分:1)
不要那样做。请使用体面的调试器。最简单的方法是使用IPython并等待异常(调试器将自动启动),或通过在部件上运行非法语句(例如1/0
)来激发异常您希望检查的代码。
答案 2 :(得分:0)