Mat*_*ner 2 python repr decorator stack-frame python-3.x
是否有一个标准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)
Run Code Online (Sandbox Code Playgroud)
我正在尝试记录某些调用,并且正在编写一个装饰器来记录对包装函数的调用以及完整的详细信息.我错了吗?
我不太确定你在问什么,但你可以使用inspect模块来获取所有当前的堆栈信息.
f = inspect.currentframe()
print(f.f_locals)
print(inspect.getframeinfo(f))
Run Code Online (Sandbox Code Playgroud)
您可以使用重新生成当前帧的调用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')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
192 次 |
| 最近记录: |