如何在Python回溯中打印本地属性?(不仅仅是帧的局部变量)

如何在Python回溯中打印本地属性?(不仅仅是帧的局部变量),python,traceback,Python,Traceback,我修改了traceback.print_异常以输出最后一帧的局部变量: 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

我修改了traceback.print_异常以输出最后一帧的局部变量:

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>
我开始使用ast模块解析源代码,以找到属性并在帧的局部区域中查找它们。它适用于我上面的一个用例,但它太脆弱,无法支持任何源代码行。实现这一目标的最佳方式是什么

以下是我用于测试用例的代码:

类Foo(对象):
foo=1
def动臂(自):
返回“,”.join(self.foo)
f=Foo()
f、 ()

如果与局部变量列表中的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:
这样的行)


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

谢谢您的回复Maxime!尽管我只想显示可能导致错误的回溯源中的值。”self“可能不是语句的一部分,所以我不想只看self,而是看任何破坏语句的东西:“,”。join(something.foo)只有当您解析最后一行以获得使用的每个标识符并使用
getattr()
,我想这将很困难。
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('__')])