Приклади для написання власних декораторів (з параметрами і без) на випадок, якщо синтаксис трохи підзабувся.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from functools import wraps

def decorator(func):
def wrapper(*args, **kwargs):
#Do something before func call
result = func(*args, **kwargs)
#Do something after func call
return result
return wrapper

def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
#Do something before func call
result = func(*args, **kwargs)
#Do something after func call
return result
return wrapper

Два приклади для декораторів без параметрів; другий з використанням functools.wraps, яка потрібна для того, щоб зберегти оригінальне ім’я і докстрінг функції замість її декоратора.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from functools import wraps

def decorator(arg1, arg2):
def outer_wrapper(func):
def wrapper(*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

def decorator(arg1, arg2):
def outer_wrapper(func):
@wraps(func)
def wrapper(*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, який прискорює написання коду і ще багато всього (див. документацію).

Ресурси