4

トレースバックの精巧な再検査を行い、トレースバックとともにより多くの (より良い?) 情報を返さないオブジェクトから実際の値を取得しようとしています。

ケース シナリオは、次のようにインポートして実行する関数にあります。

def foo():
    a = True
    b = False
    assert a == b

そして、次のように実行されます:

from foo import foo

def re_inspect():
    try:
        foo()
    except Exception, e:
         # re-inspect traceback and check `a` and `b`

が発生したときに、例外が発生した行を評価しようとすると、コードのコンテキストが不足しているため、AssertionError(もちろん)何がaまたはb(すぐに発生する) であるかを判断できません。NameError

上記のコードはインポートされてから実行されるため、アクセスできないことに注意してください。現在の名前空間に存在しないため、私の問題はコンテキストから正しい値を取得することに依存しています。 abfoofoo

「a は True で be は False」のようなことを安全に言うことができるように、何と何aを示すことができる正しいアプローチは何でしょうか?b

4

1 に答える 1

5

inspect モジュールを使用できます:

try:
    foo()
except AssertionError, e:
    import inspect
    previous_trace = inspect.trace()[1]
    frame = previous_trace[0]
    print 'value of a, b:', inspect.getargvalues(frame).locals

http://docs.python.org/library/inspect.html#inspect.getargvaluesを参照してください。

于 2011-03-03T14:56:19.547 に答える