# pragma mypy relaxed from typing import Any, Callable, TypeVar, Generic T = TypeVar( 'T' ) class traced( Generic[ T ] ): indent = 0 counter = 0 def __init__( self, f: Callable[ ..., T ] ) -> None: self.f = f def __call__( self, *args: Any, **kwargs: Any ) -> T: traced.counter += 1 cnt = traced.counter if cnt > 1: print() print( ' ' * traced.indent, self.f.__name__, list( args ), end = '' ) print( kwargs if len(kwargs) else '', end = '' ) traced.indent += 2 r = self.f( *args, **kwargs ) traced.indent -= 2 if cnt != traced.counter: print( '\n' + ' ' * traced.indent, "returned", r ) else: print( ' ->', r, end = '' ) return r import run_tests