В вашем примере делать декоратор не обязательно.Вы хотите использовать декоратор, когда пытаетесь реализовать определенное поведение для набора функций.Например, предположим, вы пытаетесь отобразить время выполнения всех функций в вашем скрипте.
Решение 1) Вы повсюду добавляете маленький кусочек кода для его отображения:
from time import time
def f1():
t0 = time()
# f1 body
print("Execution time of f1: {}".format(time()-t0))
def f2():
t0 = time()
# f2 body
print("Execution time of f2: {}".format(time()-t0))
Как видите, код очень повторяется.Если вы хотите что-то изменить в этом общем поведении, то вам нужно изменить все функции.Вот где декораторы полезны.
2) Использование декораторов:
def timer(func):
def wrapper(*args,**kwargs):
t0 = time()
res = func(*args,**kwargs)
duration = time()-t0
print("Execution time of {}: {} s".format(func.__name__, duration))
return res
return wrapper
@timer
def f1():
# body of f1
@timer
def f2():
# body of f2