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