Игнорирование синтаксиса декоратора, вот что вы делаете:
def logger(f):
def f_(a):
print("Call", a)
return f(a)
return f_
def factorial(n):
return 1 if n == 0 else n * factorial(n-1)
# `factorial` is `def f_(a):` now
factorial = logger(factorial)
Так что, чтобы просто исправить это, используйте ту же декларацию или не используйте аргументы с ключевыми словами (n=5)
Лучший способ исправить это - использовать распаковку в своей внутренней функции:
import functools
def logger(f):
@functools.wraps(f)
def f_(*args, **kwargs):
print("Call", f.__name__, *args, *[f"{k}={v!r}" for k, v in kwargs.items()])
return f(*args, **kwargs)
return f_
Вот полезная статья по теме.