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

作为调试工具打印变量名称和内容;寻找emacs/Python快捷方式,python,debugging,emacs,variables,printing,Python,Debugging,Emacs,Variables,Printing,我发现自己经常添加调试“print”语句,比如: print("a_variable_name: %s" % a_variable_name) 你们是怎么做到的?我在试图找到一种方法来优化它时是不是有点神经质?我可能正在处理一个函数,然后放入六行左右的代码,找出它不起作用的原因,然后再次删除它们 你有没有找到一种有效的方法 我正在用Emacs编写Python。不要这样做。改用一个像样的调试器。最简单的方法是使用并等待异常(调试器将自动启动),或者在要检查的代码部分运行非法语句(例如1/0)来引

我发现自己经常添加调试“print”语句,比如:

print("a_variable_name: %s" % a_variable_name)
你们是怎么做到的?我在试图找到一种方法来优化它时是不是有点神经质?我可能正在处理一个函数,然后放入六行左右的代码,找出它不起作用的原因,然后再次删除它们

你有没有找到一种有效的方法


我正在用Emacs编写Python。

不要这样做。改用一个像样的调试器。最简单的方法是使用并等待异常(调试器将自动启动),或者在要检查的代码部分运行非法语句(例如
1/0
)来引发异常。

有时调试器很棒,但有时使用打印语句更快,更易于设置和重复使用

这可能只适用于使用CPython进行调试(因为并非所有python都实现
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
的参数应该是字符串(变量名或表达式),而不是值本身

要使用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为了使用正确的工具,他正试图用瑞士军刀敲打钉子。你的方式可能不太优雅,但我发现它非常有用,与Schof有着同样的需要,那就是在调试变量时避免一些冗余的键入。我知道这是一个古老的答案,所以我认为它非常有用现在你可以直接做
frame=inspect.currentframe().f_back
,这是一个更好、更清晰的方法:)经过这么多年的时间,我终于明白了,我们一直需要的是语法宏!例如:
@show foo=1.0+3im/2
打印
foo=1.0+(3im)/2=1.0+1.5im
,其中
@show
是一个宏,可以用于指定任何表达式(在Julia中,一切都是一个表达式),您可以在这里看到宏扩展生成的代码:我发现了Python语法宏的这个实现:但是Julia元编程是最好的!
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