输出变量名和内容作为调试工具;寻找Emacs/Python快捷方式

11 投票
3 回答
3407 浏览
提问于 2025-04-15 22:35

我发现自己经常在代码里加调试用的“打印”语句,比如这样:

print("a_variable_name: %s" % a_variable_name)

你们都是怎么做的呢?我是不是有点神经质,想要找到优化的方法?有时候我在写一个函数的时候,会加上六七行这样的代码,弄明白为什么它不工作,然后又把这些代码删掉。

你们有没有什么高效的方法来处理这个问题?

我是在Emacs里写Python代码。

3 个回答

0

我想到了这个:

Python 字符串插值实现

我正在测试它,发现它在调试的时候对我很有帮助。

1

别这么做。应该用一个好的调试工具。最简单的方法就是使用 IPython,你可以等着程序出错(调试工具会自动启动),或者故意写一个错误的语句(比如 1/0),这样就能在你想检查的代码部分引发错误。

10

有时候,调试工具很好用,但有时候用打印语句更快,而且设置起来也简单,重复使用也方便。

这可能只适合在CPython中调试(因为并不是所有的Python都实现了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('的行。

撰写回答