13

我正在寻找一种在 Unix 命令行/ssh 会话上快速开发/调试小型 Python 脚本的同时快速打印变量名称和值的方法。

这似乎是一个非常普遍的要求,并且在variable_name打印或记录其值的每一行上复制 s 似乎很浪费(在击键和时间/精力上)。即而不是

print 'my_variable_name:', my_variable_name

我希望能够为str, int, list,执行以下操作dict

log(my_variable_name)
log(i)
log(my_string)
log(my_list)

并获得以下输出:

my_variable_name:some string
i:10
my_string:a string of words
my_list:[1, 2, 3]

理想情况下,输出也会记录函数名称。

我已经看到一些尝试使用locals, globals, frames 等的解决方案,但我还没有看到适用于 int、strings、lists 和函数内部的东西。

谢谢!

4

3 回答 3

7

如果您需要的工具仅用于开发和调试,那么有一个有用的包叫做q

已经提交到pypi,可以用pip install qor安装easy_install q

import q; q(foo)

# use @q to trace a function's arguments and return value
@q
def bar():
   ...

# to start an interactive console at any point in your code:
q.d()

结果/tmp/q默认输出到文件(或任何自定义路径),因此它们不会与标准输出和普通日志混合。您可以使用 . 检查输出tail -f /tmp/q。输出以不同的颜色突出显示。

作者在 PyconUS 2013 的一次闪电演讲中介绍了他的库。视频在这里,从25:15开始。

于 2013-10-11T12:41:06.997 回答
4

这是另一个邪恶的黑客:

import inspect

def log(a):
    call_line = inspect.stack()[1][4][0].strip()
    assert call_line.strip().startswith("log(")
    call_line = call_line[len("log("):][:-1]
    print "Log: %s = %s" % (call_line, a)

b=3
log(b)

这显然需要一些范围检查,更好的解析等。只有当调用总是以相同的方式进行并且可能有更多 - 我不知道 - 假设时才有效......

于 2013-10-11T12:36:45.987 回答
0

我不知道有什么方法可以简单地获取字符串变量的名称。但是,您可以获得当前功能日志的参数列表。

import inspect

def log(a):
    frame = inspect.currentframe()
    args, _, _, values = inspect.getargvalues(frame)
    print "%s:%s" % (args[0], values[args[0]])
于 2013-10-11T12:16:57.353 回答