Глубина вызова функции декоратора Python, структурированный вывод - PullRequest
0 голосов
/ 05 октября 2018

Я печатаю входы и выходы функций, но это приводит к трудному чтению журналов, особенно при слишком большом количестве вызовов вложенных функций (не рекурсивно).

Пример:

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

1 Ответ

0 голосов
/ 05 октября 2018

Python знает глубину вашего звонка в любое время.

Вы также можете распечатать информацию о том, где вы сейчас находитесь, в любое время.

Нет необходимости хранить его в отдельной переменной.

Итак, вы идете:

import traceback
len(traceback.format_stack())

Вы можете сделать отступ и исправить любые ошибки.

...