如何记录变量的名称和值?

时间:2013-10-11 12:07:28

标签: python variables logging

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

这似乎是一个非常常见的要求,在打印或记录其值的每一行上复制variable_name似乎是浪费(在按键和时间/能量上)。即而不是

print 'my_variable_name:', my_variable_name

我希望能够为strintlistdict执行以下操作:

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]

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

我已经看到一些尝试使用localsglobals,框架等的解决方案,但我还没有看到一些适用于整数,字符串,列表以及函数内部的函数。< / p>

谢谢!

3 个答案:

答案 0 :(得分:7)

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

它已提交给pypi,可以与pip install qeasy_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(或任何自定义路径),因此它们不会与stdout和普通日志混合使用。您可以使用tail -f /tmp/q检查输出。输出以不同颜色突出显示。

作者在2013年的PyconUS闪电话中介绍了他的图书馆。视频是here,从25:15开始。

答案 1 :(得分: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)

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

答案 2 :(得分:0)

我不知道如何简单地获取字符串变量的名称。 但是,您可以获取当前fonction日志的参数列表。

import inspect

def log(a):
    frame = inspect.currentframe()
    args, _, _, values = inspect.getargvalues(frame)
    print "%s:%s" % (args[0], values[args[0]])