2

我修改了 traceback.print_exception 以输出最后一帧的本地变量:

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()
4

1 回答 1

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('__')])

您可以通过检查 if getattr(f, i)is not a function 进行过滤(以避免某些行,例如boom: <bound method Foo.boom of <__main__.Foo object at 0x0000000001E2B908>>)。

我猜这不是最好的解决方案,但它应该可以解决您的问题。

于 2013-08-07T07:28:57.567 回答