我修改了traceback.print_exception以输出最后一帧的locals:
Traceback (most recent call last):
File "/home/aconrad/work/smlib.traceback/tests.py", line 287, in test_display_variable_that_is_not_local
f.boom()
File "/home/aconrad/work/smlib.traceback/tests.py", line 284, in boom
return ','.join(self.foo)
TypeError
local variables:
- self: <tests.Foo object at 0x3233350>
在上面的例子中,本地人没有用,因为我不知道打破了join()函数的self.foo的值。我想修改我的自定义回溯以打印使用的属性及其值,如下所示:
attributes:
- self.foo: 1
我开始使用ast模块解析源代码以查找属性并在框架的本地中查找它们。它适用于我上面的一个用例,但它太脆弱了,无法支持任何源代码行。实现这一目标的最佳途径是什么?
以下是我用于测试用例的代码:
class Foo(object):
foo = 1
def boom(self):
return ','.join(self.foo)
f = Foo()
f.boom()
答案 0 :(得分:0)
如果匹配本地变量列表中的self,则可以列出当前对象的属性和方法:
if and isinstance(current_var, object) and str(current_var) == 'self': # avoid to list every objects encountered...
print '\n'.join(["%s: %s" % (i, getattr(f, i)) for i in dir(f) if not i.startswit
h('__')])
您可以通过检查getattr(f, i)
是否不是函数来过滤(以避免某些行,如boom: <bound method Foo.boom of <__main__.Foo object at 0x0000000001E2B908>>
)。
这不是我猜的最佳解决方案,但它应该可以解决您的问题。