3

トレースバックで最後に呼び出された関数のパラメーターを取得できますか? どのように?

標準エラーのキャッチャーを作成して、読み取り可能なコードを作成しながら、詳細な情報をユーザーに提供したいと考えています。

次の例では、GET_PARAMS が os.chown に提供されたパラメーターのタプルを返すようにします。Alex Martelli がアドバイスしたモジュールを調べたところinspect、それが見つかりませんでした。

def catch_errors(fn):
    def decorator(*args, **kwargs):
        try:
            return fn(*args, **kwargs)
        except (IOError, OSError):
            msg = sys.exc_info()[2].tb_frame.f_locals['error_message']
            quit(msg.format(SEQUENCE_OF_PARAMETERS_OF_THE_LAST_FUNCTION_CALLED)\
            + '\nError #{0[0]}: {0[1]}'.format(sys.exc_info()[1].args), 1)
    return decorator

@catch_errors
def do_your_job():
    error_message = 'Can\'t change folder ownership \'{0}\' (uid:{1}, gid:{2})'
    os.chown('/root', 1000, 1000) # note that params aren't named vars.

if __name == '__main__' and os.getenv('USERNAME') != 'root':
    do_your_job()

(デコレーターのJim Robertに感謝)

4

3 に答える 3

5

このような検査タスクでは、常にinspect標準ライブラリのモジュールを最初に考えてください。ここで、inspect.getargvaluesは指定されたフレームの引数値を提供し、inspect.getinnerframesはトレースバック オブジェクトから対象のフレームを提供します。

于 2009-10-30T16:09:46.470 に答える
0

達成しようとしているものにデコレーターを使用する際の問題は、例外ハンドラーが取得するフレームが、 s、 s 、do_your_job()s ではなく、s であることです。したがって、出力する情報は への引数です。あなたが意図していると思う動作を得るためには、呼び出しているすべてのライブラリ関数を装飾する必要があります。os.listdir()os.makedirs()os.chown()do_your_job()

于 2009-10-30T16:38:06.180 に答える