我正在寻找一种快速打印变量名称和值的方法,同时在Unix命令行/ ssh会话中快速开发/调试小型Python脚本。
这似乎是一个非常常见的要求,在打印或记录其值的每一行上复制variable_name
似乎是浪费(在按键和时间/能量上)。即而不是
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
,框架等的解决方案,但我还没有看到一些适用于整数,字符串,列表以及函数内部的函数。< / p>
谢谢!
答案 0 :(得分:7)
如果您需要的工具仅用于开发和调试,那么有一个有用的包calle q。
它已提交给pypi,可以与pip install q
或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(或任何自定义路径),因此它们不会与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]])