Приклади для написання власних декораторів (з параметрами і без) на випадок, якщо синтаксис трохи підзабувся.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
from functools import wraps
defdecorator(func): defwrapper(*args, **kwargs): #Do something before func call result = func(*args, **kwargs) #Do something after func call return result return wrapper
defdecorator(func): @wraps(func) defwrapper(*args, **kwargs): #Do something before func call result = func(*args, **kwargs) #Do something after func call return result return wrapper
Два приклади для декораторів без параметрів; другий з використанням functools.wraps, яка потрібна для того, щоб зберегти оригінальне ім’я і докстрінг функції замість її декоратора.
defdecorator(arg1, arg2): defouter_wrapper(func): defwrapper(*args, **kwargs): # Do something before func call result = func(*args, **kwargs) # Do something after func call
#A lso you can use additonal arguments result = result * arg1 + arg2
return result return wrapper return outer_wrapper
defdecorator(arg1, arg2): defouter_wrapper(func): @wraps(func) defwrapper(*args, **kwargs): # Do something before func call result = func(*args, **kwargs) # Do something after func call
# Also you can use additonal arguments result = result * arg1 + arg2
return result return wrapper return outer_wrapper
Аналогічно для декоратора з параметрами. Додається ще одна функція-обгортка. Також для спрощення роботи з декораторами існує модуль wrapt, який прискорює написання коду і ще багато всього (див. документацію).