重新调用导致堆栈帧的调用?

时间:2011-02-22 15:00:01

标签: python python-3.x decorator repr stackframe

是否有一种标准方法来repr调用导致Python中给定堆栈帧的调用?如果做不到,有没有一种很好的方法可以手动完成?

举个例子:

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)

我正在尝试记录某些调用,并且正在编写一个装饰器,用于记录对包装函数的调用以及完整的详细信息。我是不是错了?

1 个答案:

答案 0 :(得分: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')