【发布时间】:2014-10-08 11:13:53
【问题描述】:
对于 Python 2.7,我有一个用于调试的小工具:
def printvar(label, var):
print "%s:\n%s" % (label, pformat(var))
我经常把它称为 printvar("foo", foo)。
是否可以简化一点,只传递变量,如 printvar(foo),但仍然打印变量的名称?使用内省什么的?
【问题讨论】:
标签: python
对于 Python 2.7,我有一个用于调试的小工具:
def printvar(label, var):
print "%s:\n%s" % (label, pformat(var))
我经常把它称为 printvar("foo", foo)。
是否可以简化一点,只传递变量,如 printvar(foo),但仍然打印变量的名称?使用内省什么的?
【问题讨论】:
标签: python
你不能这样做,但你可以近似相反:只传入标签,让它获取实际值。这是一个快速版本:
def printvar(label):
for frame in inspect.getouterframes(inspect.currentframe())[1:]:
local_vars = frame[0].f_locals
if label in local_vars:
print "%s:\n%s" % (label, frame[0].f_locals[label])
return
raise NameError("No such variable")
那么你可以这样做:
def foo():
x = 2
printvar('x')
>>> foo()
x:
2
当然,这是一件非常棘手的事情:代码会查看其调用链中每个堆栈帧的局部变量命名空间。通常这种诡计是要避免的,但出于调试目的,它可能在紧要关头很有用。
【讨论】: