2

reprPython で特定のスタック フレームを生成する呼び出しの標準的な方法はありますか? それができない場合、手動で行う良い方法はありますか?

例として:

def some_call(*args, **kwargs):
    print('{}({})'.format(
         'some_call',
         ', '.join(itertools.chain(
             map(repr, args),
             ('{}={!r}'.format(k, kwargs[k]) for k in kwargs)))))

>>> some_call(1, 2, a=3)
some_call(1, 2, a=3)

特定の呼び出しをログに記録しようとしており、ラップされた関数への呼び出しを完全な詳細でログに記録するデコレータを作成しています。私はこれについて間違っていますか?

4

1 に答える 1

5

何を求めているのかよくわかりませんが、inspectモジュールを使用して現在のスタック情報をすべて取得できます。

f = inspect.currentframe()
print(f.f_locals)
print(inspect.getframeinfo(f))

を使用して現在のフレームの呼び出しを再生成inspect.getargvaluesし、好みに合わせてフォーマットすることができます

def some_call(arg1, arg2, *args, **kwargs):
    f = inspect.currentframe()
    fn_name = inspect.getframeinfo(f)[2]
    arginfo = inspect.getargvalues(f)
    args = [repr(arginfo.locals[arg]) for arg in arginfo.args]
    varargs = [repr(x) for x in arginfo.locals[arginfo.varargs]]
    kwargs = [', '.join(str(k)+"="+repr(v) for k,v in 
        arginfo.locals[arginfo.keywords].items())]
    print('{0}({1})'.format(fn_name, ', '.join(args + varargs + kwargs)))

>>> some_call(1, 2, "hi", kw1="frob")
some_call(1, 2, 'hi', kw1='frob')
于 2011-02-22T15:29:44.017 に答える