关于Python:如何使用和自动包括变量名称

How to pprint and automatically include the the variable name

本问题已经有最佳答案,请猛点这里访问。

对于python 2.7,我有一个调试工具:

1
2
3
def printvar(label, var):
    print"%s:
%s"
% (label, pformat(var))

我经常把它叫做printvar("foo",foo)。

是否可以简化一点点,只传入变量(如printvar(foo)),但仍然让它打印变量的名称?用反省还是什么?


你不能这样做,但你可以近似地反过来:只传递标签,让它获取实际值。以下是一个快速版本:

1
2
3
4
5
6
7
8
def printvar(label):
    for frame in inspect.getouterframes(inspect.currentframe())[1:]:
        local_vars = frame[0].f_locals
        if label in local_vars:
            print"%s:
%s"
% (label, frame[0].f_locals[label])
            return
    raise NameError("No such variable")

然后你可以这样做:

1
2
3
4
5
6
7
def foo():
    x = 2
    printvar('x')

>>> foo()
x:
2

当然,这是一个非常糟糕的业务:代码查看其调用链中每个堆栈帧的局部变量名称空间。通常情况下,这种欺骗是可以避免的,但为了调试的目的,在必要的时候它是有用的。