pdb 是一个功能齐全的 python shell,因此您可以执行任意命令。
locals()
and globals()
将显示范围内的所有变量及其值。
您可以使用dir()
如果您对价值观不感兴趣。
当您在 Python 中声明变量时,它会根据需要放入局部变量或全局变量中,并且无法区分您定义的变量和出于其他原因而在您的范围内的变量。
当您使用 dir() 时,您感兴趣的变量可能位于该列表的开头或结尾。如果你想获取键、值对
过滤本地变量()可能看起来像这样:
>>> x = 10
>>> y = 20
>>> {k: v for k,v in locals().iteritems() if '__' not in k and 'pdb' not in k}
{'y': 20, 'x': 10}
如果你的 locals() 实在是一团糟,你就需要一些更严厉的东西。您可以将以下函数放入 pythonpath 上的模块中,并在调试会话期间导入它。
def debug_nice(locals_dict, keys=[]):
globals()['types'] = `__import__`('types')
exclude_keys = ['copyright', 'credits', 'False',
'True', 'None', 'Ellipsis', 'quit']
exclude_valuetypes = [types.BuiltinFunctionType,
types.BuiltinMethodType,
types.ModuleType,
types.TypeType,
types.FunctionType]
return {k: v for k,v in locals_dict.iteritems() if not
(k in keys or
k in exclude_keys or
type(v) in exclude_valuetypes) and
k[0] != '_'}
我添加了一个示例会话pastebin http://pastebin.com/USVw11bJ
有几个案例被遗漏了。您可能想扩展它以允许您也传递类型。但它应该允许您过滤除您定义的变量之外的大多数内容。
dir()
如果您只想要最后 20 个值,那么您会得到如下输出>>> p var1 var2 ... varn
会给你,那么你最好像 dir()[-20:] 那样切片 dir() ,但是您不会轻易看到变量和值之间的关系。例如:“我是在 bar 之前还是之后声明 foo 的?”
如果您想查看这种关系,您可以尝试类似的操作,它假设您的变量位于 dir() 的末尾。如果它们位于开头,您可以进行不同的切片。如果您的变量不连续,这将无法正常工作。
>>> zip(dir(), [eval(var) for var in dir()])[-4:]
[('a', 10), ('var', 'var'), ('x', 30), ('y', 50)]