【问题标题】:Python decorator function call depth, structured outputPython装饰器函数调用深度,结构化输出
【发布时间】:2018-10-05 09:11:35
【问题描述】:

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

示例:

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 python-3.x decorator


    【解决方案1】:

    Python 随时了解您的调用深度。

    您还可以随时打印您当前所在位置的追溯信息。

    无需将其保存在单独的变量中。

    所以你去:

    import traceback
    len(traceback.format_stack())
    

    由您决定缩进并修复任何错误。

    【讨论】:

    • 谢谢。我已经从堆栈中删除了所有出现的装饰器文件并获取了它的长度,以便将来嵌套的装饰器或装饰器本身不会增加长度。
    猜你喜欢
    • 2017-12-11
    • 2018-02-02
    • 2017-01-15
    • 2017-08-01
    • 2019-01-12
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    相关资源
    最近更新 更多