打印变量名称和内容作为调试工具;寻找emacs / Python快捷方式

时间:2010-05-11 18:04:40

标签: python debugging emacs variables printing

我发现自己经常添加调试“打印”语句 - 这样的事情:

print("a_variable_name: %s" % a_variable_name)

你们都是这样做的?我是否在试图寻找优化方法的神经质?我可能正在研究一个函数并输入这些函数中的大约六个,弄清楚它为什么不起作用,然后再将它们删除。

你有没有一种有效的方法呢?

我在Emacs中编写Python代码。

3 个答案:

答案 0 :(得分:9)

有时调试器很棒,但有时使用print语句更快,更容易重复设置和使用。

这可能仅适用于使用CPython进行调试(因为并非所有Pythons都实现inspect.currentframeinspect.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)

我想出了这个:

Python string interpolation implementation

我正在测试它,并且在调试时它对我来说很方便。