Python装饰器函数调用深度,结构化输出

标签 python python-3.x decorator

我正在打印函数的输入和输出,但这会导致日志难以阅读,尤其是嵌套函数调用过多(非递归)时。

示例:

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())

由您来进行缩进并修复任何相差一位的错误。

关于Python装饰器函数调用深度,结构化输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52662165/

相关文章:

python - 带参数和不带参数的上下文装饰器

python - Django 说 "id may not be NULL"但这是为什么呢?

python - django-mptt:处理并发插入

python - 关于复数的奇怪行为

python - 遍历嵌套字典

javascript - 如何创建一个向组件类添加单个函数的装饰器?

python - 集成 python-social-auth (social-app-django) 以与 Django 管理一起使用

Python - 忽略列表中的字符串不起作用

python - 获取 Python 中特殊字符前后的字符串

javascript - Sinon stub 一个包含同步和异步函数的对象