python - Python装饰器函数调用深度,结构化输出
问题描述
我正在打印函数的输入和输出,但这会导致日志难以阅读,尤其是嵌套函数调用过多(非递归)。
例子:
Calling test1()
Calling test2()
Calling test3()
Calling test4()
'test4' returned None
'test3' returned None
'test2' returned None
'test1' returned None
我想看到这样的输出:
Calling test1()
Calling test2()
Calling test3()
Calling test4()
'test4' returned None
'test3' returned None
'test2' returned None
'test1' returned None
如果我可以保持呼叫计数并通过每次递增将其转移到下一个呼叫,我就可以实现这一点。然后我什至可以根据这个计数的值对输出进行着色,并生成更易于阅读的日志。
有没有办法可以将当前调用的深度保持在迭代器内?
作为参考,这里是装饰器:
def trace(func):
"""Print the function signature and return value"""
@functools.wraps(func)
def wrapper_debug(*args, **kwargs):
args_repr = [repr(a) for a in args] # 1
kwargs_repr = [f"{k}={v!r}" for k, v in kwargs.items()] # 2
signature = ", ".join(args_repr + kwargs_repr) # 3
print(start + f"Calling {func.__name__}({signature})" + end)
value = func(*args, **kwargs)
print(f"{func.__name__!r} returned {value!r}") # 4
return value
return wrapper_debug
解决方案
Python 随时了解您的调用深度。
您还可以随时打印您当前所在位置的回溯。
无需将其保存在单独的变量中。
所以你去:
import traceback
len(traceback.format_stack())
由您决定缩进并修复任何错误。
推荐阅读
- android - Firebase 连接问题 - Android
- r - 在二维数据框中访问/索引
- azure - 如何为成功的 SQL DacPac 导入创建事件网格订阅?
- java - 如何通过 Java 使用 Selenium 在文章标签内定位按钮
- javascript - removeClass 在 console.log 中工作,但不在 DOM 中
- android - Android View以错误的方向关闭动画
- javascript - 重复单击按钮时防止标签图像再次加载
- javascript - PerformanceNavigationTiming API 的特征检测
- css - 多个 CSS 文件,包括库文件 VS 一个大文件包括所有库 css 文件
- javascript - 为什么要在 React 中为一个组件同时创建 index.js 和 Component.js?