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 モジュールを使用してソースの解析を開始し、属性を見つけてフレームのローカルで検索しました。上記の 1 つのユース ケースでは機能しますが、脆弱すぎてソース行をサポートできません。これを達成するための最良の方法は何ですか?

テストケースに使用したコードは次のとおりです。

class Foo(object):
    foo = 1

    def boom(self):
        return ','.join(self.foo)

f = Foo()
f.boom()
4

1 に答える 1

0

ローカル変数リストで自己に一致する場合、現在のオブジェクトの属性とメソッドのリストを表示できます。

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>>)。

それは私が推測する最善の解決策ではありませんが、問題を解決するはずです。

于 2013-08-07T07:28:57.567 に答える