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