use a decorator to print function calls

def print_function_name(func):
    def _print_function_name(*args, **kwargs):
        print(f"--> begin:  {func.__name__}")
        result = func(*args, **kwargs)
        print(f"--> return: {func.__name__}")
        return result
    return _print_function_name